ASP.NET MVC 4

ASP.NET MVC 4

Адам Фриман

Определение значений по умолчанию

Причина того, что мы получили сообщение об ошибке, когда мы запросили URL по умолчанию для приложения, заключается в том, что он не соответствовал заданному роуту. URL по умолчанию выражается для системы маршрутизации как ~/, и нет никаких сегментов в этой строке, которые могут подойти переменным controller и action, определенным нашей простой роутинговой схемой.

Мы объяснили ранее, что URL паттерны носят консервативный характер в том, что они будут соответствовать только URL с указанным количеством сегментов. Мы также сказали, что это поведение по умолчанию. Один из способов изменить это поведение – это использовать значения по умолчанию. Значение по умолчанию применяется тогда, когда URL не содержит сегмент, который может соответствовать значению. В листинге 13-9 показан пример роута, который содержит значение по умолчанию.

Примечание

Начиная с этого момента, когда мы покажем вам новую конфигурацию маршрутизации. Мы работаем с измененным методом RegisterRoutes класса RouteConfig.

Листинг 13-9: Добавление значения по умолчанию в роут
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;
namespace UrlsAndRoutes
{
	public class RouteConfig
	{
		public static void RegisterRoutes(RouteCollection routes)
		{
			routes.MapRoute("MyRoute", "{controller}/{action}",
			new { action = "Index" });
		}
	}
}

Значения по умолчанию поставляются как свойства в анонимном типе. В листинге 13-9 мы предоставили значение по умолчанию Index для переменной action. Этот роут будет соответствовать всем двухсегментным URL, как это было ранее. Например, если запрашивается URL http://mydomain.com/Home/Index, роут будет извлекать Home как значение для controller и Index в качестве значения для action.

Но теперь, когда мы указали значение по умолчанию для сегмента action, роут будет также соответствовать односегментному URL. При обработке односегментного URL система маршрутизации извлекает значение controller из одного URL сегмента и использует значение по умолчанию для переменной action. Таким образом, мы можем запросить URL http://mydomain.com/Home и вызвать метод действия Index контроллера Home.

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

Листинг 13-10: Добавление в роут значений по умолчанию для действия и контроллера
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;
namespace UrlsAndRoutes
{
	public class RouteConfig
	{
		public static void RegisterRoutes(RouteCollection routes)
		{
			routes.MapRoute("MyRoute", "{controller}/{action}",
			new { controller = "Home", action = "Index" });
		}
	}
}

Поскольку мы предоставили значения по умолчанию для переменных controller и action, мы создали роут, который будет соответствовать URL, имеющим ноль, один или два сегмента, как показано в таблице 13-2.

Таблица 13-2: Подходящие URL
Число сегментов Пример Соответствие
0 mydomain.com controller = Home, action = Index
1 mydomain.com/Customer controller = Customer, action = Index
2 mydomain.com/Customer/List controller = Customer, action = List
3 mydomain.com/Customer/List/All Нет соответствия: слишком много сегментов

Чем меньше сегментов мы получаем во входящем URL, тем больше мы полагаемся на значения по умолчанию, до того момента, пока мы не получим URL без сегментов, где используются только значения по умолчанию. Вы можете увидеть результат использования значений по умолчанию, если снова запустите приложение. На этот раз, когда браузер запрашивает корневой URL для приложения, будут использоваться значения по умолчанию для сегментных переменных controller и action, что приведет к тому, что MVC вызовет метод действия Index контроллера Home, как показано на рисунке 13-4.

Рисунок 13-4: Использование значений по умолчанию, чтобы расширить сферу использования роута

Юнит тестирование: значения по умолчанию

Нам не нужно предпринимать никаких специальных действий, если мы используем вспомогательные методы для проверки роутов, которые определяют значения по умолчанию. Вот мы сделали изменения в тестовом методе TestIncomingRoutes в файле RouteTests.cs для роута, который мы определили в листинге 13-10:

...
[TestMethod]
public void TestIncomingRoutes() {
	TestRouteMatch("~/", "Home", "Index");
	TestRouteMatch("~/Customer", "Customer", "Index");
	TestRouteMatch("~/Customer/List", "Customer", "List");
	TestRouteFail("~/Customer/List/All");
}
...

Единственное замечание состоит в том, что мы должны указать URL по умолчанию как ~/, так как таким образом ASP.NET представляет URL системе маршрутизации. Если указать пустую строку (""), которую мы использовали для определения роута, или /, система маршрутизации выбросит исключение, и тест будет провален.

или RSS канал: Что новенького на smarly.net