我正在实现一个自定义ModelBinder
,我正在尝试使用PropertyDescriptor.SetValue设置一个属性,而我无法弄清楚它为什么不起作用。
对于某些复杂属性,该值未设置,但不会引发异常。该属性仍然是null
,但对某些人来说确实如此。
如果我检索PropertyInfo并致电SetValue,则每次都可以正常使用。
Mvc source from codeplex内部正在使用propertyDescriptor.SetValue(bindingContext.Model, value);
所以我猜这是最好的方式吗?
public class MyCustomBinder : DefaultModelBinder
{
public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
foreach (PropertyDescriptor property in TypeDescriptor.GetProperties(bindingContext.Model))
{
object value = property.GetValue(bindingContext.Model);
// Perform custom bindings
// Call SetValue on PropertyDescriptor (Works sometimes)
property.SetValue(bindingContext.Model, value);
Debug.Assert(property.GetValue(bindingContext.Model) == value, "Value not set");
// Get PropertyInfo and call SetValue (Working)
bindingContext.ModelType.GetProperty(property.Name).SetValue(bindingContext.Model, value, null);
Debug.Assert(property.GetValue(bindingContext.Model) == value, "Value not set");
}
return bindingContext.Model;
}
}
注1:我反映的对象用nhibernate映射,所以我怀疑代理可能有什么东西。
注意2:它不能与DefaultModelBinder一起使用,但是正在重新创建对象,因此发布的数据很好。
答案 0 :(得分:2)
我不确定你想要实现什么,但我会忽略MVC源代码使用propertyDescriptor.SetValue的事实,如果你已经知道propertyInfo.setValue为你提供了你想要的东西。您正在编写扩展类,只需使用有效且代码良好的代码:
Type modelType = bindingContext.ModelType;
foreach (PropertyInfo property in modelType.GetProperties())
{
// ...
property.SetValue(bindingContext.Model, value, null);
}