#asp.net-mvc #asp.net-mvc-routing
#asp.net-mvc #asp.net-mvc-routing
Вопрос:
Я только изучаю MVC и хочу добавить некоторую пользовательскую маршрутизацию на свой сайт.
Мой сайт разделен на бренды, поэтому перед доступом к другим частям сайта пользователь выберет бренд. Вместо того, чтобы где-то хранить выбранный бренд или передавать его в качестве параметра, я хотел бы сделать его частью URL, чтобы, например, получить доступ к действию NewsControllers index, а не «mysite.com/news « Я хотел бы использовать «mysite.com/brand/news /».
Я просто очень хочу добавить маршрут, в котором указано, имеет ли URL-адрес бренд, перейдите к контроллеру / действию как обычно и пройдите через brand…is это возможно?
Спасибо
C
Ответ №1:
Да, это возможно. Сначала необходимо создать RouteConstraint
, чтобы убедиться, что выбран бренд. Если бренд не был выбран, этот маршрут должен завершиться ошибкой, и должен следовать маршрут к действию для перенаправления на селектор бренда. RouteConstraint должен выглядеть следующим образом:
using System;
using System.Web;
using System.Web.Routing;
namespace Examples.Extensions
{
public class MustBeBrand : IRouteConstraint
{
public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
{
// return true if this is a valid brand
var _db = new BrandDbContext();
return _db.Brands.FirstOrDefault(x => x.BrandName.ToLowerInvariant() ==
values[parameterName].ToString().ToLowerInvariant()) != null;
}
}
}
Затем определите свои маршруты следующим образом (при условии, что ваш выбор бренда является домашней страницей):
routes.MapRoute(
"BrandRoute",
"{controller}/{brand}/{action}/{id}",
new { controller = "News", action = "Index", id = UrlParameter.Optional },
new { brand = new MustBeBrand() }
);
routes.MapRoute(
"Default",
"",
new { controller = "Selector", action = "Index" }
);
routes.MapRoute(
"NotBrandRoute",
"{*ignoreThis}",
new { controller = "Selector", action = "Redirect" }
);
Затем в вашем SelectorController
:
public ActionResult Redirect()
{
return RedirectToAction("Index");
}
public ActionResult Index()
{
// brand selector action
}
Если ваша домашняя страница не является селектором бренда или на сайте есть другой контент, не относящийся к бренду, то эта маршрутизация неверна. Вам понадобятся дополнительные маршруты между BrandRoute и Default, которые соответствуют маршрутам для вашего другого контента.
Комментарии:
1. Большое спасибо advisellorben, это навело меня на правильный путь!!