ASP.NET MVC - смешивание пользовательской и стандартной привязки модели
36 anonymous [2009-06-09 17:17:00]
У меня есть тип:
public class IssueForm
{
Order Order {get; set;}
Item Item {get; set;}
Range Range {get; set;}
}
Я создал настраиваемое связующее устройство из-за требований к Order и Item, но Range все еще может использовать привязку модели по умолчанию.
Есть ли способ из моего настраиваемого связующего объекта для вызова связующего объекта по умолчанию для возврата объекта Range? Я думаю, что мне просто нужно правильно настроить ModelBindingContext, но я не знаю, как это сделать.
ИЗМЕНИТЬ
Глядя на первый комментарий и ответ - кажется, что наследование от стандартного связующего может быть полезным.
Чтобы добавить дополнительные настройки для моей установки, я:
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
}
}
Это может быть глупый способ сделать это... это мое первое связующее устройство. Просто указывая на мою текущую реализацию.
ИЗМЕНИТЬ № 2
Таким образом, ответы на переопределение BindProperty будут работать, если я смогу подключиться, как метод "Я все сделаю привязку", и вызову метод Factory со свойствами.
Я думаю, мне действительно стоит взглянуть на реализацию DefaultModelBinder и перестать быть глупым.
asp.net-mvc
3 ответа
24 Решение eu-ge-ne [2009-06-09 17:30:00]
Попробуйте что-то вроде этого:
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);
}
}
переопределить 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
}
}
6 Konstantin [2010-03-03 22:48:00]
Я думаю, что я бы зарегистрировал два разных пользовательских привязки модели: один для Order и один для Item, и пусть связующее устройство по умолчанию обрабатывает Range и IssueForm.