Asp.Net Custom Routing и настраиваемая маршрутизация и добавление категории перед контроллером - PullRequest
1 голос
/ 10 октября 2011

Я только изучаю MVC и хочу добавить некоторую пользовательскую маршрутизацию на мой сайт.

Мой сайт разделен на бренды, поэтому перед доступом к другим частям сайта пользователь выберет марку.Вместо того, чтобы хранить выбранный бренд где-либо или передавать его в качестве параметра, я хотел бы сделать его частью URL-адреса, чтобы получить доступ к действию индекса NewsControllers, например, вместо "mysite.com/news" Я бы хотелиспользовать "mysite.com/brand/news /" .

Я просто очень хочу добавить маршрут, который говорит, что если у URL есть бренд, перейдите к контроллеру / действию как обычнои пройти через бренд ... это возможно?

Спасибо

C

1 Ответ

8 голосов
/ 10 октября 2011

Да, это возможно. Во-первых, вы должны создать 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, которые соответствуют маршрутам к вашему другому контенту.

...