Asp.net MVC 3 - 自定义模型绑定 [英] Asp.net mvc 3 - Custom model binding

查看:98
本文介绍了Asp.net MVC 3 - 自定义模型绑定的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有这样一个模型

 公共字符串名称{;组; }    公共IEnumerable的< INT> ProjectMembersId {搞定;组; }

属性名应当使用非标准结合code的约束。

但物业ProjectMembersId应该用我的自定义code的约束。

所以,我得出从DefaultModelBinder类和overrided setProperty方法。

 保护覆盖无效的SetProperty(ControllerContext controllerContext,ModelBindingContext的BindingContext,System.ComponentModel.PropertyDescriptor的PropertyDescriptor,对象的值)
{
    如果(propertyDescriptor.Name ==ProjectMembersId)
    {
        VAR名单=新名单,LT; INT>(5);        VAR形式= controllerContext.HttpContext.Request.Form;        变种名称= form.AllKeys.Where(X => x.StartsWith(dhxGridObj));        的foreach(在名称变量名称)
        {
            INT I;            如果(int.TryParse(form.Get(名称),发现我))
            {
                list.Add(ⅰ);
            }
        }        值=清单;
    }    base.SetProperty(controllerContext,BindingContext中,PropertyDescriptor的,价值);
}

老兄的问题是SetProperty方法不被调用,因为该值提供程序不包含一个称为ProjectMembersId一个项目。

也许我重写defaultModelBinder的错误部分。所以什么了是最好的一段路要走?

解决方案

BindProperty 试试看方式:

公共类CustomModelBinder:DefaultModelBinder
    {
        保护覆盖无效BindProperty(ControllerContext controllerContext,
                                             ModelBindingContext BindingContext中,
                                             System.ComponentModel.PropertyDescriptor的PropertyDescriptor)
        {
            如果(propertyDescriptor.Name ==ProjectMembersId)
            {
                VAR名单=新名单,LT; INT>(5);
                VAR形式= controllerContext.HttpContext.Request.Form;
                变种名称= form.AllKeys.Where(X => x.StartsWith(dhxGridObj));                的foreach(在名称变量名称)
                {
                    INT I;
                    如果(int.TryParse(form.Get(名称),发现我))
                    {
                        list.Add(ⅰ);
                    }
                }                的SetProperty(controllerContext,BindingContext中,PropertyDescriptor的,清单);
            }
            其他
            {
                base.BindProperty(controllerContext,BindingContext中,PropertyDescriptor的);
            }
        }
    }

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.

But the property ProjectMembersId should be bound using my custom code.

So I derived a class from the DefaultModelBinder and overrided the SetProperty method.

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.

Maybe I'm overriding a wrong part of the defaultModelBinder. So what'd be the best way to go ?

解决方案

Try it with BindProperty method:

    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);
            }
        }
    }

这篇关于Asp.net MVC 3 - 自定义模型绑定的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆