Asp.Net Пользовательская маршрутизация и пользовательская маршрутизация и добавление категории перед контроллером

#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, это навело меня на правильный путь!!