【问题标题】:ASP.NET MVC3 Custom Model Binder IssuesASP.NET MVC3 自定义模型绑定器问题
【发布时间】:2012-06-28 15:43:33
【问题描述】:

我有一个包含标签列表的申请人模型:

public class Applicant
{
    public virtual IList<Tag> Tags { get; protected set; }
}

提交表单时,有一个输入字段,其中包含用户输入的以逗号分隔的标签列表。我有一个自定义模型绑定器可以将此列表转换为集合:

public class TagListModelBinder : IModelBinder
{
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var incomingData = bindingContext.ValueProvider.GetValue("tags").AttemptedValue;
        IList<Tag> tags = incomingData.Split(',').Select(data => new Tag { TagName = data.Trim() }).ToList();
        return tags;
    }
}

但是,当我的模型被填充并传递到 POST 上的控制器操作时,Tags 属性仍然是一个空列表。知道为什么它没有正确填充列表吗?

【问题讨论】:

标签: asp.net-mvc asp.net-mvc-3 model-binding imodelbinder


【解决方案1】:

问题是您在Tags 属性中有protected 设置访问器。如果您将其更改为public,如下所示,一切正常。

public class Applicant
{
    public virtual IList<Tag> Tags { get; set; }
}

【讨论】:

    【解决方案2】:

    模型绑定器仅绑定提交的值。它不绑定视图中呈现的值。

    您需要创建自定义 EditorTemplate 以根据需要呈现标签。

    【讨论】:

      【解决方案3】:

      MVC 可以already bind to a List,我建议使用已经可以满足您需要的内置技术。

      我没有注意到任何有关添加活页夹的代码,您是否将您的 ModelBinder 添加到活页夹中?

      protected void Application_Start()
      {
        ModelBinders.Binders.Add(typeof(IList<Tag>), new TagListModelBinder());
      }
      

      【讨论】:

      • 是的,我确实将它添加到活页夹中并且它正在被调用。它只是没有填充到 action 方法参数中。
      • 我查看了您关于绑定到列表的链接。不幸的是,这在我的场景中不起作用,因为我在客户端使用的 javascript 将所有内容都放在一个输入字段中。
      猜你喜欢
      • 2011-04-27
      • 1970-01-01
      • 1970-01-01
      • 2011-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-14
      • 2018-05-07
      相关资源
      最近更新 更多