Добавление нескольких префиксов в DefaultModelBinder MVC2 - PullRequest
1 голос
/ 18 июля 2010

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

Я бы хотел:

<%= 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, но не могу найти подходящее место для добавления этого крошечного функционала.

Ответы [ 2 ]

2 голосов
/ 10 сентября 2011

Свойство 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 для указанных вами типов, используйте связыватель этой модели!

1 голос
/ 18 июля 2010

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

====== РЕДАКТИРОВАТЬ ======

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

...