选择路由取决于URL参数。约束

时间:2015-12-15 09:37:05

标签: c# asp.net-mvc routes

首先,我需要说我在我的项目中使用T4MVC。我有两种方法的方法:

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。他们有不同的网址。第一条路线的示例:

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

第二条路线的例子:

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

这篇文章应该说我来自另一页。我需要将布尔参数添加到我的方法List(string slug, string category, String selectedFilters, bool onsale)中,并依赖于此选择路由。是否可以使用约束?在这种情况下,愿任何人提供一个如何做到的例子吗?

1 个答案:

答案 0 :(得分:0)

我不确定我是否理解你的问题。我遇到的两个案例可能对你有帮助。

案例1:根据用于访问页面的URL重定向到另一个URL。

步骤1:创建MVCRouteHandler

公共类LandingPageRouteHandler:MvcRouteHandler {     protected override IHttpHandler GetHttpHandler(RequestContext Context)     {         if(Context.HttpContext.Request.Url.DnsSafeHost.ToLower()。包含(“abc”))         {             Context.RouteData.Values [“controller”] =“LandingPage”;             Context.RouteData.Values [“action”] =“索引”;             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添加属性到控制器和视图

我的案例中的所有控件都派生自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执行某些操作,以便可以根据需要进行处理。