2010-07-18 3 views
1

Я просмотрел большинство примеров ModelBinding, но, похоже, не могу найти то, что я ищу.Добавление нескольких префиксов в DefaultModelBinder MVC2

Я хотел бы:

<%= Html.TextBox("User.FirstName") %> 
<%= Html.TextBox("User.LastName") %> 

связываться с этим методом на пост

public ActionResult Index(UserInputModel input) {} 

где UserInputModel является

public class UserInputModel { 
    public string FirstName {get; set;} 
    public string LastName {get; set;} 
} 

Соглашение состоит в том, чтобы использовать имя класса Санс " InputModel ", но я бы не хотел указывать это каждый раз с помощью BindAttribute, то есть:

public ActionResult Index([Bind(Prefix="User")]UserInputModel input) {} 

Я попытался переопределить DefaultModelBinder, но, похоже, не нашел подходящего места для ввода этой крошечной функциональности.

ответ

1

BindAttribute может использоваться на уровне класса, чтобы избежать дублирования его для каждого экземпляра параметра UserInputModel.

====== ====== EDIT

Просто сбросив префикс из вашей формы или с помощью BindAttribute на модели представления будет самый простой вариант, но альтернативой было бы зарегистрировать пользовательское связующее устройство для типа UserInputModel и явно ищет префикс, который вы хотите.

+0

Это полезно знать и делает мою задачу более управляемой. Хотя мне все равно хотелось бы знать, можно ли это сделать за кулисами процесса привязки модели, поскольку для атрибута требуются постоянные значения. –

+0

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

1

Объект ModelName в объекте ModelBindingContext передан функции BindModel - это то, что вы хотите установить. Вот модель связующая, что делает это:

public class PrefixedModelBinder : DefaultModelBinder 
{ 
    public string ModelPrefix 
    { 
     get; 
     set; 
    } 

    public PrefixedModelBinder(string modelPrefix) 
    { 
     ModelPrefix = modelPrefix; 
    } 

    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
     bindingContext.ModelName = ModelPrefix; 
     return base.BindModel(controllerContext, bindingContext); 
    } 
} 

Зарегистрируйте его в вашем Application_Start так:

ModelBinders.Binders.Add(typeof(MyType), new PrefixedModelBinder("Content")); 

Теперь вы больше не будете нуждаться, чтобы добавить атрибут Bind для типов вы задаете использовать эту модель связующий !

+0

+1 для вдохновения, это помогло мне решить долговременную проблему – Odys