ASP.NET MVC - сочетание пользовательских и стандартных моделей привязки - PullRequest
38 голосов
/ 09 июня 2009

У меня есть тип:

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

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

Есть ли в моем пользовательском связывателе модели способ вызвать связующее звено модели по умолчанию для возврата объекта 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
    }
}

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


РЕДАКТИРОВАТЬ # 2

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

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

Ответы [ 3 ]

52 голосов
/ 09 июня 2009

переопределить 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
            }
        }
25 голосов
/ 09 июня 2009

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

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);
    }

}
6 голосов
/ 03 марта 2010

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

...