asp.net-mvc - Asp.net mvc 3 - 自定义模型绑定(bind)

标签 asp.net-mvc asp.net-mvc-3 modelbinders

我有一个这样的模型

    public string Name { get; set; }

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

属性名称应使用标准绑定(bind)代码进行绑定(bind)。

但是属性 ProjectMembersId 应该使用我的自定义代码绑定(bind)。

所以我从 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, 
                                             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 - Asp.net mvc 3 - 自定义模型绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5246608/

相关文章:

asp.net-mvc - 接受逗号和点作为小数分隔符

ASP.NET Windows 身份验证路由不同组

asp.net-mvc - 使用 razorgenerator 在不同项目中具有相同名称的 2 个 razor 部分 View

c# - 录音机,将 Blob 文件保存到服务器 - C#,Mvc

c# - 声明具有属性的类并同时填充这些属性的最佳方法是什么

.net - ViewData 和 ViewBag 有什么区别?

asp.net-mvc - 使用 Ninject 将类注入(inject) IModelBinder

asp.net-mvc - 使用 ASP.Net MVC 中的模型绑定(bind)器更新父/子记录

c# - Visual Studio 中的 Entity Framework : database is not created with DbContext base constructor

c# - 在没有 HttpContext 的情况下如何确定文件的物理路径?