2009-06-09 3 views
36

я типа:ASP.NET MVC - Смешивание на заказ и по умолчанию модель привязки

public class IssueForm 
{ 
    Order Order {get; set;} 
    Item Item {get; set;} 
    Range Range {get; set;} 
} 

Я создал пользовательские модели связующего из-за требований по заказу и позиции, но диапазон по-прежнему можно использовать по умолчанию Model Binder.

Есть ли способ из моего пользовательского связующего объекта вызвать функцию связывания по умолчанию для возврата объекта Range? Думаю, мне просто нужно правильно настроить ModelBindingContext, но я не знаю, как это сделать.


EDIT

Глядя на первый комментарий и ответ - похоже, унаследовав от модели связующего по умолчанию может быть полезным.

Чтобы добавить больше подробностей для моей установки до сих пор у меня есть:

public IssueFormModelBinder : IModelBinder 
{ 
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
     Order = //code to pull the OrderNumber from the context and create an Order 
     Item = //code to pull the ItemNumber from the context and create an Item 

     IssueForm form = IssueFormFactory.Create(Order, Item); 

     form.Range = // ** I'd like to replace my code with a call to the default binder ** 

     return form 
    } 
} 

Это может быть глупый способ сделать это ... это моя первая модель связующего. Просто указывая на мою текущую реализацию.


EDIT # 2

Так ответы переопределить BindProperty будет работать, если я могу подключить в как метод «Я все сделано связывания» и вызвать метод Factory со свойствами.

Я думаю, мне действительно стоит взглянуть на реализацию DefaultModelBinder и перестать быть глупым.

+1

Я не уверен, что это самое изящное решение, но вы могли бы получить свое собственное связующее устройство для модели от DefaultModelBinder вместо того, чтобы внедрять IModelBinder? Затем, когда вы переопределите BindModel, передайте ответственность до DefaultModelBinder, где это необходимо. В противном случае используйте пользовательскую привязку. –

+0

Да, я вижу, что некоторые связующие устройства уходят с IModelBinder и DefaultModelBinder. Я думаю, у DefaultModelBinder есть несколько дополнительных методов, которые я предполагаю, что он вызывает метод BindModel, чтобы вы могли больше сосредоточить свои потребности? – anonymous

+0

Это только подтверждает мое решение игнорировать обработку и проверку ввода кода ModelBinder и вручную. Теперь у меня есть он последовательный, прозрачный и настраиваемый, чтобы представить и вообразить будущие потребности. – User

ответ

24

Попробуйте что-то вроде этого:

public class CustomModelBinder : DefaultModelBinder { 
    protected override void BindProperty(ControllerContext controllerContext, ModelBindingContext bindingContext, PropertyDescriptor propertyDescriptor) { 
     if(propertyDescriptor.Name == "Order") { 
      ... 
      return; 
     } 

     if(propertyDescriptor.Name == "Item") { 
      ... 
      return; 
     } 

     base.BindProperty(controllerContext, bindingContext, propertyDescriptor); 
    } 

} 
+0

Я, вероятно, здесь глуп, но как вы реализуете класс CustomModelBinder, наверняка, это должно быть создано где-то для этого? Может быть, как атрибут в параметрах ActionResult? –

49

переопределять значение BindProperty из DefaultModelBinder:

public class CustomModelBinder:DefaultModelBinder 
     { 
      protected override void BindProperty(ControllerContext controllerContext, ModelBindingContext bindingContext, System.ComponentModel.PropertyDescriptor propertyDescriptor) 
      { 
       if (propertyDescriptor.PropertyType == typeof(Range)) 
       { 
        base.BindProperty(controllerContext, bindingContext, propertyDescriptor); 
       } 
       // bind the other properties here 
      } 
     } 
+20

+1 для типа типа inspedcting вместо имени. Вините магические строки! –

6

Я думаю, что я бы зарегистрировал два различных пользовательскую модель связующих, один порядок и один для пункта, и пусть связующее устройство по умолчанию обрабатывает Range и IssueForm.

+4

Да, очевидно, это было некоторое время, так как я задал этот вопрос. Я закончил поиск кода DefaultModelBinder и понял рекурсивный характер привязки модели. Я не понимал, что сложный тип, содержащий другие сложные типы, я мог бы просто определить модельное связующее для каждого отдельно. Я подумал, что сложный родитель должен знать детали каждого сложного ребенка. – anonymous