Asp.net mvc 3 - 自定义模型绑定

4
我有一个像这样的模型。
    public string Name { get; set; }

    public IEnumerable<int> ProjectMembersId { get; set; }

属性 Name 应使用标准绑定代码进行绑定。

但是,属性 ProjectMembersId 应使用我的自定义代码进行绑定。

因此,我从 DefaultModelBinder 派生了一个类,并重写了 SetProperty 方法。

protected override void SetProperty(ControllerContext controllerContext, ModelBindingContext bindingContext, System.ComponentModel.PropertyDescriptor propertyDescriptor, object value)
{
    if (propertyDescriptor.Name == "ProjectMembersId")
    {
        var list = new List<int>(5);

        var form = controllerContext.HttpContext.Request.Form;

        var names = form.AllKeys.Where(x => x.StartsWith("dhxGridObj"));

        foreach (var name in names)
        {
            int i;

            if (int.TryParse(form.Get(name), out i))
            {
                list.Add(i);
            }
        }

        value = list;
    }

    base.SetProperty(controllerContext, bindingContext, propertyDescriptor, value);
}

问题在于 SetProperty 方法没有被调用,因为值提供程序中不包含名为 ProjectMembersId 的项目。

也许我正在覆盖默认模型绑定器的错误部分。那么最好的方法是什么?


1
你是否为此模型注册了自定义模型绑定器? - frennky
当然,如果跳过SetProperty函数,那么ModelBinder就不会被调用。 - user256034
1个回答

9

使用BindProperty方法进行尝试:

    public class CustomModelBinder : DefaultModelBinder
    {
        protected override void BindProperty(ControllerContext controllerContext, 
                                             ModelBindingContext bindingContext, 
                                             System.ComponentModel.PropertyDescriptor propertyDescriptor)
        {
            if (propertyDescriptor.Name == "ProjectMembersId")
            {
                var list = new List<int>(5);    
                var form = controllerContext.HttpContext.Request.Form;    
                var names = form.AllKeys.Where(x => x.StartsWith("dhxGridObj"));

                foreach (var name in names)
                {
                    int i;    
                    if (int.TryParse(form.Get(name), out i))
                    {
                        list.Add(i);
                    }
                }

                SetProperty(controllerContext, bindingContext, propertyDescriptor, list);
            }
            else
            {
                base.BindProperty(controllerContext, bindingContext, propertyDescriptor);
            }
        }
    }

SetProperty 和 BindProperty 有什么区别? - user256034

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接