【问题标题】:ASP.NET mvc 3 model binding with list of strings带有字符串列表的 ASP.NET mvc 3 模型绑定
【发布时间】:2014-05-25 02:06:03
【问题描述】:

我目前正在使用模型绑定和 ASP.NET MVC 3 和 .NET 4.0。

  1. 查看模型类:

    public class BasicViewModel 
    {
        [Display(Name = @"Names")]
        [Required(ErrorMessage = @"Names is required")]
        [DisplayFormat(ConvertEmptyStringToNull = true)]
        List<string> Names { get; set; }
    
        [Display(Name = @"Email")]
        [Required(ErrorMessage = @"Email is required")]
        string Email { get; set; }
    
    }
    
  2. 控制器

    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult NameEmail( BasicViewModel basicModel)
    {
          // some manipulation of data
    }
    
  3. 在cshtml文件中查看(剃刀视图引擎)

     // model declared here using @model BasivViewModel
     // only required part shown labels part of code removed
     @Html.TextBoxFor(model => model.Names)
     ...
     @Html.TextBoxFor(model => model.Email)
     ...
    

ASP.NET MVC 提供的模型绑定将字符串 Email 绑定为空,如果它为空,但将 List Names 绑定到空字符串 ("")。我希望它为空。我通过单击提交按钮解析表单字段的值,使用 JavaScript 完成了绑定工作。但我希望 asp.net 模型绑定能够做到这一点。此外,如果 Data Annotations 类中有一些字段,例如此功能所需的字段,那就太好了。我试过这个Null Display Text Property 并参考备注部分。是否有解决方案或者这是如何实施的?我不确定我是否正确理解了模型绑定的这一部分。

【问题讨论】:

  • @vishalsharma 我可以知道上面的链接是如何解决问题的吗?我知道如何建模绑定到列表。如果您能就链接如何解决问题提供一些解释,那就太好了。
  • hanselman.com/blog/… 阅读此内容.. 如果您不明白,请告诉我,我一定会提供帮助
  • 文章中的 @vishalsharma 很明显,列表的索引需要是连续的。但我想我错过了那篇文章和列表名称如何绑定到空字符串而不是 null 之间的链接,而字符串电子邮件中的情况并非如此。
  • 你能告诉我在发布期间 request.form 中有哪些可用的值吗..

标签: asp.net-mvc model-binding


【解决方案1】:

默认情况下,如果表示数组的字段在html中,控制器将收到一个长度为0的数组。但是,要使该数组为空,您可以定义一个自定义的ModelBinder。

public class MyModelBinder : DefaultModelBinder
{
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        if (bindingContext.ModelType == typeof(List<string>))
        {
            HttpRequestBase request = controllerContext.HttpContext.Request;
            // Check to see if any of the elements the array is not empty and
            // returns null if they all are.
            return request.Form.GetValues("Names").Any(x => !string.IsNullOrWhiteSpace(x)) ?
                base.BindModel(controllerContext, bindingContext) :
                null;
            //You can also remove empty element from the array as well, by using
            // a where clause
        }
        return base.BindModel(controllerContext, bindingContext);
    }
}

或者,您也可以实现 IModelBinder 而不是 DefaultModelBinder。

下一步是在 Global.asax.cs 文件中的 Application_Start 函数中注册自定义绑定器。

ModelBinders.Binders.Add(typeof(List<string>), new MyModelBinder());

这基本上告诉mvc引擎在字段为List&lt;string&gt;时使用MyModelBinder

要了解有关 modelbinder 的更多信息,请访问谷歌“MVC 自定义模型绑定”。让我知道你走了:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-14
    • 1970-01-01
    • 2011-08-07
    • 2011-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多