我遇到以下问题:如果我通过 AJAX 向 api 控制器提交包含复选框中选中值的表单,则 ModelState 对象说它无效。
先决条件:
- 视觉工作室 2012
- ASP.NET MVC 4 最终版
- 最新的 jQuery 和 jQuery 不显眼的验证东西(版本 1.8.2 和 1.9.0.1)
重现步骤:
- 为表单创建了一个 ViewModel,包含布尔字段:
public class CheckboxViewModel { [Display(Name="Test checkbox")] public bool TestCheckbox { get; set; } }
- 创建了简单地准备 ViewModel 并呈现表单的控制器操作:
public ActionResult Index() { return View(new CheckboxViewModel()); }
- 用表单创建了一个视图
@using (Ajax.BeginForm("Post", "api/Values", null, new AjaxOptions { HttpMethod = "POST" }, new { id = "form" })) { @Html.ValidationSummary(true) @Html.LabelFor(model => model.TestCheckbox) @Html.EditorFor(model => model.TestCheckbox) @Html.ValidationMessageFor(model => model.TestCheckbox) <input type="submit" value="Submit" /> }
- 创建的 Web API 操作检查模型状态是否有效并返回状态代码 200,否则返回 400:
public HttpResponseMessage Post(CheckboxViewModel model) { if (!ModelState.IsValid) return new HttpResponseMessage(HttpStatusCode.BadRequest); return new 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: true
和TestCheckbox:false
,所以我认为这可能会影响活页夹并引发异常。仍然没有选择如何解决这个问题。