use*_*034 4 asp.net-mvc modelbinders asp.net-mvc-3
我有这样的模特
public string Name { get; set; }
public IEnumerable<int> ProjectMembersId { get; set; }
Run Code Online (Sandbox Code Playgroud)
应使用标准绑定代码绑定属性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);
}
Run Code Online (Sandbox Code Playgroud)
芽问题是没有调用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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6020 次 |
| 最近记录: |