在选中的复选框中发布表单时 ModelState 无效

2024-05-24

我遇到以下问题:如果我通过 AJAX 向 api 控制器提交包含复选框中选中值的表单,ModelState 对象会说它无效。

先决条件:

  1. 视觉工作室2012
  2. ASP.NET MVC 4 最终版
  3. 最新的 jQuery 和 jQuery 不显眼的验证内容(版本 1.8.2 和 1.9.0.1)

重现步骤:

  1. 为表单创建了一个 ViewModel,包含布尔字段:
    
    
    public class CheckboxViewModel
    {
    [Display(Name="Test checkbox")]
    public bool TestCheckbox { get; set; }
    }
      
  2. 创建的控制器操作只需准备 ViewModel 并呈现表单:
    
    
    public ActionResult Index()
    {
        return View(new CheckboxViewModel());
    }
      
  3. 使用表单创建了视图
    
    
    @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" />
    }
      
  4. 创建了 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(使用前将#替换为@)

在选中的复选框中发布表单时 ModelState 无效 的相关文章

随机推荐