ModelState中发布选中的复选框中的窗体时无效(ModelState is invalid w

2019-09-23 20:22发布

我遇到以下问题:如果我提交包含检查值复选框,通过AJAX API控制器形式的ModelState对象说,这是无效的。

先决条件:

  1. 的Visual Studio 2012
  2. ASP.NET MVC 4决赛
  3. 最新的jQuery和jQuery不显眼验证的东西(1.8.2和1.9.0.1版本)

重现步骤:

  1. 创造了形式的视图模型,包含布尔字段:
      公共类CheckboxViewModel  {  [显示(名称= “测试复选框”)]  公共BOOL TestCheckbox {获得;  组;  }  } 
  2. 创建了一个简单的准备视图模型和呈现形式控制器操作:
      公众的ActionResult指数()  {      返回查看(新CheckboxViewModel());  } 
  3. 创建了形式的视图
      @using(Ajax.BeginForm( “后”, “API /值”,NULL,新AjaxOptions {列举HTTPMethod = “POST”},{新的id = “形式”}))  {      @ Html.ValidationSummary(真)      @ Html.LabelFor(型号=> model.TestCheckbox)      @ Html.EditorFor(型号=> model.TestCheckbox)      @ Html.ValidationMessageFor(型号=> model.TestCheckbox)      <INPUT TYPE = “提交” 值= “提交”/>  } 
  4. 来检查,如果ModelState中是有效的,并返回状态代码200,否则400创建的Web API的行动:
      公共HttpResponseMessage邮政(CheckboxViewModel模型)  {      如果(!ModelState.IsValid)          返回新HttpResponseMessage(HttpStatusCode.BadRequest);      返回新HttpResponseMessage(HttpStatusCode.OK);  } 

我做了一些谷歌上搜索,我知道编辑器复选框提供了额外的隐藏字段,但它似乎是确定并需要对模型绑定。 所以,当我取消复选框,并提交表单一切正常,服务器状态200响应,这要归功于隐藏字段,我想。 然而,当我做选中复选框并提交表单,服务器状态400响应,这意味着ModelState中处于无效状态。 的ModelState在这种情况下,包含空的ErrorMessage和下面的异常信息的错误:

 {System.InvalidOperationException: The parameter conversion from type 'System.Collections.Generic.List`1[System.String]' to type 'System.Boolean' failed because no type converter can convert between these types. в System.Web.Http.ValueProviders.ValueProviderResult.ConvertSimpleType(CultureInfo culture, Object value, Type destinationType) в System.Web.Http.ValueProviders.ValueProviderResult.UnwrapPossibleArrayType(CultureInfo culture, Object value, Type destinationType) в System.Web.Http.ValueProviders.ValueProviderResult.ConvertTo(Type type, CultureInfo culture) в System.Web.Http.ValueProviders.ValueProviderResult.ConvertTo(Type type) в System.Web.Http.ModelBinding.Binders.TypeConverterModelBinder.BindModel(HttpActionContext actionContext, ModelBindingContext bindingContext)} 

我不知道如何正确处理这个问题。 我应该创建自定义的模型绑定? 还是我失去了一些东西? 任何帮助,将不胜感激。 谢谢。

我创建解决方案再现了我的问题。

更新:我已经想通了,形式实际上包含的值TestCheckbox: trueTestCheckbox:false ,所以我觉得这也许某种影响的粘合剂和它抛出一个异常。 仍然没有选择如何解决此。

Answer 1:

我遇到了同样的问题,发送形式与JavaScript的Web API。 这里是你可以用它来解决此问题的基本修正。 我知道这是一种简单的,甚至丑陋的 - 如果你有很多的复选框并不太实用。 然而,这个想法很简单,可以很容易地扩展,以满足您的要求。

您发布表单(使用jQuery)前补充一点:

if ($('[name="MyCheckbox"]:checked').length > 0)
    $('[name="MyCheckbox"]:hidden').detach();
else if ($('[name="MyCheckbox"]:hidden').length < 1)
    $('#myForm').append('<input type="hidden" name="MyCheckbox" value="false" />');

// Etc...
$.ajax({ });

所以,你删除隐藏字段,如果复选框被选中,又添加了它,如果未选中该复选框,并隐藏字段已经被删除。

看到这个小提琴: http://jsfiddle.net/Hsfdg/



Answer 2:

我试图实现这个

if ($('[name="MyCheckbox"]:checked').length > 0)
    $('[name="MyCheckbox"]:hidden').detach();
else if ($('[name="MyCheckbox"]:hidden').length < 1)
    $('#myForm').append('<input type="hidden" name="MyCheckbox" value="false" />');

但最终的模型属性时隐藏复选框被分离被删除。

Instad设置在预期设置其他默认为false模型属性为true值隐藏chechbox值为true结果。

if ($('[name="MyCheckbox"]:checked').length > 0)
    $('[name="MyCheckbox"]:hidden').val(true);


文章来源: ModelState is invalid when posting a form within checked checkbox