PropertyDescriptor.SetValue在ModelBinder中不起作用

时间:2011-07-06 20:19:46

标签: c# asp.net-mvc nhibernate reflection model-binding

我正在实现一个自定义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一起使用,但是正在重新创建对象,因此发布的数据很好。

1 个答案:

答案 0 :(得分:2)

我不确定你想要实现什么,但我会忽略MVC源代码使用propertyDescriptor.SetValue的事实,如果你已经知道propertyInfo.setValue为你提供了你想要的东西。您正在编写扩展类,只需使用有效且代码良好的代码:

Type modelType = bindingContext.ModelType;
foreach (PropertyInfo property in modelType.GetProperties())
{
    // ...
    property.SetValue(bindingContext.Model, value, null);
}