Создание собственного класса RouteBase
Я хочу знать, какова функция HttpContext.Request.AppRelativeCurrentExecutionFilePath
в приведенном ниже коде. Пожалуйста, объясните, как система маршрутизации соответствует запрошенному URL:
public override RouteData GetRouteData(HttpContextBase httpContext)
{
RouteData result = null;
string requestedURL = string.Empty;
for (int i = 0; i < urls.Length; i++)
{
if(httpContext.Request.AppRelativeCurrentExecutionFilePath.Contains(urls[i]))
{
requestedURL = httpContext.Request.AppRelativeCurrentExecutionFilePath;
break;
}
}
if (!string.IsNullOrEmpty(requestedURL))
{
result = new RouteData(this, new MvcRouteHandler());
result.Values.Add("controller", "CustomRoute");
result.Values.Add("action", "DirectCustomUrls");
result.Values.Add("customUrl", requestedURL);
}
return result;
}
1 ответ
Система маршрутизации работает как оператор switch-case. Первый маршрут, который совпадает, выигрывает, и все маршруты, которые зарегистрированы позже, игнорируются.
Таким образом, каждый маршрут имеет не одну, а три отдельные обязанности (независимо от того, является ли маршрут входящим HTTP-запросом или генерацией исходящего URL-адреса):
- Чтобы соответствовать запросу.
- Если запрос совпадает, укажите набор значений маршрута (или виртуальный путь в случае генерации URL).
- Если запрос не совпадает, верните
null
,
Код, который вы разместили, выполняет все три задачи.
Соответствие запросу
string requestedURL = string.Empty;
for (int i = 0; i < urls.Length; i++)
{
if(httpContext.Request.AppRelativeCurrentExecutionFilePath.Contains(urls[i]))
{
requestedURL = httpContext.Request.AppRelativeCurrentExecutionFilePath;
break;
}
}
if (!string.IsNullOrEmpty(requestedURL))
{
Приведенный выше код соответствует запросу, проверяя его по массиву значений URL. По сути, все, что он говорит, это "если массив содержит URL текущего запроса, это совпадение".
Фактическая проверка, соответствует ли она строке if (!string.IsNullOrEmpty(requestedURL))
, что позволяет условию пройти, если URL содержит значение, отличное от значения по умолчанию String.Empty
,
Предоставление набора значений маршрута
result = new RouteData(this, new MvcRouteHandler());
result.Values.Add("controller", "CustomRoute");
result.Values.Add("action", "DirectCustomUrls");
result.Values.Add("customUrl", requestedURL);
Приведенный выше код создает новый RouteData
объект, который поддерживается стандартом MvcRouteHandler
,
Затем он заполняет значения маршрута результата. Для MVC, controller
а также action
являются обязательными, и значения могут содержать другие вещи, такие как первичные ключи, текущая культура, текущий пользователь и т. д.
возврате null
RouteData result = null;
// <snip>
if (!string.IsNullOrEmpty(requestedURL))
{
// <snip>
}
return result;
Приведенный выше код устанавливает шаблон, чтобы гарантировать, что когда маршрут не соответствует запросу, возвращаемый результат null
,
Этот шаг чрезвычайно важен. Если вы не вернете нуль в случае несоответствия, механизм маршрутизации не будет проверять любые маршруты, зарегистрированные после текущего.
Рассмотрим эту конфигурацию маршрута:
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.Add(new CustomRoute());
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
}
Если CustomRoute
не может вернуться null
в случае, если входящий запрос не соответствует маршруту, структура маршрутизации никогда не будет проверять Default
маршрут. Это делает CustomRoute
чрезвычайно негибкий, потому что он не может быть зарегистрирован до любого другого маршрута в конфигурации.