Asp.net MVC 3 - 自定义模型绑定 [英] Asp.net mvc 3 - Custom model binding
问题描述
我有这样一个模型
公共字符串名称{;组; } 公共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的错误部分。所以什么了是最好的一段路要走? P>
与 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屋!