我遇到以下问题:如果我通过 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 操作来检查 modelstate 是否有效并返回状态代码 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)}
我不知道如何正确处理这个问题。我应该创建自定义模型活页夹吗?或者我错过了什么?
任何帮助,将不胜感激。谢谢。
我已经创建了solution https://github.com/hjarvard/Checkbox-WebAPI-Test这重现了我的问题。
UPDATE:我发现表单实际上包含值TestCheckbox: true
and TestCheckbox:false
,所以我认为这可能会影响活页夹并引发异常。仍然没有选择如何解决这个问题。
我在使用 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/ http://jsfiddle.net/Hsfdg/
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)