2015-12-15 6 views
0

Прежде всего, мне нужно сказать, что я использую T4MVC в своем проекте. У меня есть один метод для двух маршрутов:Выбрать маршрут зависит от параметра URL. Ограничения

public virtual ActionResult List(string slug, string category, String selectedFilters) 

Маршруты:

routes.MapRoute("ProductOnSale", "products/{slug}/{category}/onsale", MVC.Product.List()); 
routes.MapRoute("ProudctsList", "products/{slug}/{category}/{selectedFilters}", MVC.Product.List() 
       .AddRouteValue("selectedFilters", "")); 

Как вы можете видеть, что это только один ActionResult для двух маршрутов. У них другой URL. Пример первого маршрута:

products/living-room-furniture/sofas/sectional-sofa 

Пример второго маршрута:

products/living-room-furniture/living-room-tables/onsale 

Этот кусок должен сказать, что я пришел из другой страницы. Мне нужно добавить параметр Boolean к моему методу List(string slug, string category, String selectedFilters, bool onsale) и, в зависимости от этого, выберите маршрут. Можно ли использовать ограничения? Может ли кто-нибудь представить пример, как это сделать в этом случае?

+0

Как создать 2 действия с параметрами для двух ситуаций и внутри этих действий вызвать функцию (с 4 параметрами), которые возвращают список продуктов? – adricadar

+0

Возможно, этот вариант возможен. Но это хорошее решение в целом? –

+1

Пока вы не пишете * дублирующий * код, по моему мнению, это ** простое ** приемлемое решение. – adricadar

ответ

0

Я не уверен, правильно ли я понял ваш вопрос. Два случая, которые я прихожу, могут помочь вам.

CASE 1: перенаправление на другой URL-адрес в зависимости от URL-адреса, используемого для доступа к странице.

ШАГ 1: Создание MVCRouteHandler

общественного класса LandingPageRouteHandler:. MvcRouteHandler { защищен переопределение IHttpHandler GetHttpHandler (RequestContext Context) { если (Context.HttpContext.Request.Url.DnsSafeHost.ToLower() Содержит ("abc")) { Context.RouteData.Values ​​["controller"] = "LandingPage"; Context.RouteData.Values ​​["action"] = "Index"; Context.RouteData.Values ​​["id"] = "abc"; } return base.GetHttpHandler (Context); } }

ШАГ 2: Добавьте RouteHandler

  routes.MapRoute(
       name: "Landingpage", 
       url: "Landingpage/{id}/{*dummy}", 
       defaults: new { controller = "Landingpage", action = "Index" } 
      ); 

routes.MapRoute(
    name: "Default", 
    url: "{controller}/{action}/{id}", 
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
).RouteHandler = new LandingPageRouteHandler(); 

СЛУЧАЙ 2: Добавьте свойство в контроллер и вид в зависимости от URL используется

Все controlles в моем случае происходят из BaseController класс. В BaseController у меня есть:

protected override void OnActionExecuting(ActionExecutingContext filterContext) 
{ 
    base.OnActionExecuting(filterContext); 

    //Set TenantByDomain 
    var DnsSafeHost = filterContext.HttpContext.Request.Url.DnsSafeHost; 
    int? TenantByDomain = null; 
    if (db.Tenants.Any(x => x.DnsDomains.Contains(DnsSafeHost))) 
    { 
     TenantByDomain = db.Tenants.First(x => x.DnsDomains.Contains(DnsSafeHost)).Id; 
    } 
    ((BaseController)(filterContext.Controller)).TenantByDomain = TenantByDomain; 
    filterContext.Controller.ViewBag.TenantByDomain = TenantByDomain; 
} 

Применимо к вашему вопросу. Используя обработчик маршрута, вы можете добавить дополнительное свойство, указывающее исходный маршрут и перенаправить оба на 3-й URL (! Пользователь не видит этот новый URL-адрес).

В OnActionExecuting сделать что-то с дополнительным значением routevalue, чтобы обработка могла быть выполнена по желанию.