2011-07-06 3 views
3

Я реализую пользовательский ModelBinder, где я пытаюсь установить свойство с PropertyDescriptor.SetValue, и я не могу понять, почему он не работает.PropertyDescriptor.SetValue не работает в ModelBinder

Для некоторых сложных свойств значение не задается, но оно не вызывает исключения. Имущество по-прежнему 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, но объекты воссозданы, поэтому опубликованные данные в порядке.

ответ

2

Я не уверен, чего вы хотите достичь, но я бы проигнорировал тот факт, что исходный код MVC использует свойствоDescriptor.SetValue, если вы уже знаете, что propertyInfo.setValue дает вам то, что вы хотите. Вы пишете класс расширения, просто используйте то, что работает, и это хороший код:

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

 Смежные вопросы

  • Нет связанных вопросов^_^