Главная страница   /   22.2. Понимание модели связывания данных (ASP.NET MVC 4

ASP.NET MVC 4

ASP.NET MVC 4

Адам Фриман

22.2. Понимание модели связывания данных

Связывание данных представляет собой мост между запросом HTTP и методами C#, которые определяют наши методы действий контроллера. Связывание данных используется в той или иной степени в большинстве приложений MVC Framework, в том числе и в том простом примере, который мы создали в предыдущей главе. Чтобы увидеть связывание данных в действии, запустите приложение и перейдите по ссылке /Home/Index/1. Результат показан на рисунке 22-1.

Рисунок 22-1: Связывание данных

Наша ссылка содержит значение свойства PersonId объекта Person, который мы хотели отобразить:

/Home/Index/1

Когда MVC Framework вызывает метод Index контроллера Home для обслуживания запроса, он преобразовывает эту часть URL и использует ее в качестве аргумента:

public ActionResult Index(int id) {

Преобразование сегмента URL в аргумент метода int является примером связывания данных. В следующих разделах мы рассмотрим процесс, который был инициирован этим простым примером, а затем изучим более сложные функции связывания данных. Процесс, который запускает связывание данных, начинается после получения запроса и его обработки системой маршрутизации. Мы не изменили для приложения конфигурацию маршрутизации, и для обработки запроса был использован маршрут по умолчанию, который Visual Studio добавила в файл /App_Start/RouteConfig.cs. Он показан в листинге 22-5.

Листинг 22-5: Маршрут по умолчанию, добавленный в приложение Visual Studio
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;

namespace MvcModels
{
	public class RouteConfig
	{
		public static void RegisterRoutes(RouteCollection routes)
		{
			routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
			routes.MapRoute(
				name: "Default",
				url: "{controller}/{action}/{id}",
				defaults: new
				{
					controller = "Home",
					action = "Index",
					id = UrlParameter.Optional
				}
				);
		}
	}
}

Определение и принципы работы маршрутов были описаны в главе 13, и мы не будем повторять эту информацию здесь. Для связывания данных самой важной частью маршрута является дополнительная переменная сегмента id. Когда мы переходим по ссылке /Home/Index/1, то ее последний сегмент, который указывает на интересующий нас объект Person, соотносится с переменной маршрутизации id.

Механизм вызова действий, которые мы рассмотрели в главе 15, с помощью информации о маршрутизации определяет, что для обслуживания запроса необходим метод Index, но он не может вызвать метод Index, если у него нет значений для аргумента метода.

Механизм вызова действий по умолчанию, ControllerActionInvoker (см. главу 15), использует механизмы связывания данных (model binders) для создания объектов, которые необходимы для вызова действия. Механизмы связывания данных определяются интерфейсом IModelBinder, который показан в листинге 22-6. Позже в данной главе мы вернемся к этому интерфейсу, когда будем создавать пользовательский механизм связывания данных.

Листинг 22-6: Интерфейс IModelBinder
namespace System.Web.Mvc
{
	public interface IModelBinder
	{
		object BindModel(ControllerContext controllerContext,
			ModelBindingContext bindingContext);
	}
}

В приложении MVC может быть несколько механизмов связывания данных, и каждый механизм может создавать один или несколько типов моделей. Когда механизму вызова действий нужно вызвать какой-либо метод действия, он смотрит на параметры, которые определяют данный метод, и находит механизм связывания данных для типа каждого параметра. В нашем примере механизм вызова действий обнаружит, что метод Index имеет только один параметр int. Затем он найдет механизм связывания, работающий со значениями int, и вызовет его метод BindModel.

Механизм связывания должен предоставить значение int, так чтобы его можно было использовать для вызова метода Index. Обычно для этого он трансформирует какой-либо элемент данных запроса (например, значения формы или строковые значения запроса), но в MVC Framework нет никаких ограничений на то, как будут получены данные.

Далее в этой главе мы покажем вам несколько примеров пользовательских механизмов связывания. Мы также продемонстрируем вам некоторые функции класса ModelBindingContext, который передается в метод IModelBinder.BindModel.