ASP.NET MVC3自定义模型Binder问题

时间:2012-06-28 15:43:33

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

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

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属性仍然是一个空列表。知道为什么它没有正确填充列表吗?

3 个答案:

答案 0 :(得分:2)

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

您需要创建自定义EditorTemplate以在需要时呈现标记。

答案 1 :(得分:2)

问题是您在protected属性中设置了Tags设置访问者。如果您将其更改为public,则可以正常使用。

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

答案 2 :(得分:1)

MVC可already bind to a List,我建议使用已经完成所需工作的内置技术。

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

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