【问题标题】:Select route depends on URL parameter. Constraints选择路由取决于 URL 参数。约束
【发布时间】:2015-12-15 09:37:04
【问题描述】:

首先,我需要说我在我的项目中使用了 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) 中添加布尔参数,并根据此选择路由。是否可以使用约束?谁能提供一个例子,在这种情况下如何做到这一点?

【问题讨论】:

  • 如何为您的 2 种情况创建 2 个带有参数的操作,并在该操作中调用返回产品列表的函数(带有 4 个参数)?
  • 当然,这种变体是可能的。但总的来说,这是一个好的解决方案吗?
  • 只要你不写重复代码,在我看来这是一个简单可以接受的解决方案。

标签: c# asp.net-mvc routes


【解决方案1】:

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

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

第 1 步:创建 MVCRouteHandler

公共类 LandingPageRouteHandler : MvcRouteHandler { 受保护的覆盖 IHttpHandler GetHttpHandler(RequestContext Context) { if (Context.HttpContext.Request.Url.DnsSafeHost.ToLower().Contains("abc")) { Context.RouteData.Values["controller"] = "LandingPage"; Context.RouteData.Values["action"] = "Index"; Context.RouteData.Values["id"] = "abc"; } 返回 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;
}

适用于您的问题。 使用路由处理程序,您可以添加一个额外的属性来指示所采用的原始路由并将两者都重定向到第三个 url(!用户看不到这个新 url)。

在 OnActionExecuting 中使用额外的路由值做一些事情,以便可以根据需要进行处理。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-10
    • 1970-01-01
    • 1970-01-01
    • 2011-03-28
    • 1970-01-01
    • 1970-01-01
    • 2022-01-15
    • 2012-04-06
    相关资源
    最近更新 更多