简体   繁体   English

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

[英]Asp.net mvc 3 - Custom model binding

I have a model like this 我有这样的模特

    public string Name { get; set; }

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

The property Name should be bound using the standart binding code. 应使用标准绑定代码绑定属性Name。

But the property ProjectMembersId should be bound using my custom code. 但属性ProjectMembersId应该使用我的自定义代码绑定。

So I derived a class from the DefaultModelBinder and overrided the SetProperty method. 所以我从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);
}

Bud the problem is the SetProperty method isn't called because the value provider doesn't contain an item called ProjectMembersId. 芽问题是没有调用SetProperty方法,因为值提供程序不包含名为ProjectMembersId的项。

Maybe I'm overriding a wrong part of the defaultModelBinder. 也许我正在覆盖defaultModelBinder的错误部分。 So what'd be the best way to go ? 那么最好的方式是什么?

Try it with BindProperty method: 使用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);
            }
        }
    }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM