加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

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

发布时间:2020-12-16 07:22:27 所属栏目:asp.Net 来源:网络整理
导读:我有这样的模特 public string Name { get; set; } public IEnumerableint ProjectMembersId { get; set; } 应使用标准绑定代码绑定属性Name. 但属性ProjectMembersId应该使用我的自定义代码绑定. 所以我从DefaultModelBinder派生了一个类并重写了SetPropert
我有这样的模特

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的项.

也许我正在覆盖defaultModelBinder的错误部分.那么最好的方式是什么?

解决方法

使用BindProperty方法尝试:

public class CustomModelBinder : DefaultModelBinder
    {
        protected override void BindProperty(ControllerContext controllerContext,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,list);
            }
            else
            {
                base.BindProperty(controllerContext,propertyDescriptor);
            }
        }
    }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读