Создание привязчика модели

Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core

Последнее обновление: 31.10.2015

Чтобы создать привязчик модели, нам надо реализовать интерфейс 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)
{
    //...........
}
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850