Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core
Чтобы создать привязчик модели, нам надо реализовать интерфейс IModelBinder:
public class BookModelBinder : IModelBinder { public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) { // Получаем поставщик значений var valueProvider = bindingContext.ValueProvider; // получаем данные по одному полю ValueProviderResult vprId = valueProvider.GetValue("Id"); // получаем данные по остальным полям string name = (string)valueProvider.GetValue("Name").ConvertTo(typeof(string)); string author = (string)valueProvider.GetValue("Author").ConvertTo(typeof(string)); int year = (int)valueProvider.GetValue("Year").ConvertTo(typeof(int)); Book book = new Book() { Name = name + " (new)", Author = author, Year = year }; // если поле Id определено (редактирование) if (vprId != null) { book.Name = name; // без new book.Id=(int)vprId.ConvertTo(typeof(int)); } return book; } }
Данный интерфейс содержит единственный метод BindModel
, который мы и реализуем в новом классе.
Сначала мы получаем поставщик значений, а затем с его помощью получаем значения для отдельных свойств будущего
объекта Book
. Чтобы корректным образом получить значение, мы преобразуем его к надлежащему типу: int id = (int)valueProvider.GetValue("Id").ConvertTo(typeof(int));
.
И в конце возвращаем созданный объект Book
.
Теперь нам надо зарегистрировать привязчик модели. Это можно сделать двумя способами. Первый способ - регистрация в файле Global.asax:
public class MvcApplication : System.Web.HttpApplication { protected void Application_Start() { ModelBinders.Binders.Add(typeof(Book), new BookModelBinder()); //...................................................... } }
Альтернативный способ регистрации привязчика - использование соответствующего атрибута для модели:
[ModelBinder(typeof(BookModelBinder))] public class Book { //........... }
Теперь для модели Book будет использоваться привязчик BookModelBinder. Ну и в любом методе, который принимает в качестве параметра объект Book, можно протестировать привязчик:
[HttpPost] public ActionResult Index(Book book) { //........... }