ASP.NET MVC.路由管理器.解决具有类似链接值的路由问题

本文关键字:路由 链接 问题 MVC NET 管理器 解决 ASP | 更新日期: 2023-09-27 18:28:24

我需要关于我最近遇到的一个问题的建议。问题的本质是:在我的网站上,我有一个Controller。设为ProductController。当然,我有一些Actions

public class ProductController : Controller
{ 
 public virtual ActionResult ProductDetails(string slug)
    public virtual ActionResult ProductList (string slug, string category, string filter)
}

Filter参数可以为空。我在RouteConfig:中的路线

routes.MapRoute("ProudctsList", "products/{slug}/{category}/{selectedFilters}", MVC.Product.ProductList()
                .AddRouteValue("selectedFilters", ""));
routes.MapRoute("Products", "products/{slug}", MVC.Product.ProductDetails());
routes.MapRoute("CustomPage", "custom/{slug}", MVC.CustomPage.Index());
......
routes.MapRoute("BrandCollectionDetails", "brand/{slug}/{collectionId}", MVC.Brand.BrandCollectionDetails());    
routes.MapRoute("BrandDetails", "brand/{slug}", MVC.Brand.BrandDetails());
routes.MapRoute("HomePage", "", MVC.Home.Index());                   
routes.MapRoute("Sales.Index", "sales", MVC.Sales.Index());

根据要求,我需要从Url中删除products。我的意思是,如果Url有这样的方案产品/汽车/奥迪/黑色-它应该只是汽车/音频/黑色。此外,我还需要从Url中删除custom。正如你所看到的,我会得到相同方案的Urls。我需要说的是,我有自定义Urls:的List

List<string> customPages = new List<string> {/Ferrari, ...}

我的意思是,所有方案为/{something}Urls都应该使用该List进行检查。我只需要从该Urls中删除products/products/{slug}/{category}/{filter},从该custom/{slug}中删除custom,并将用户引导到必要的Controller Action。我不知道如何建立自定义路线管理器来解决这个问题,需要专家的帮助。请告诉我问题是否清楚。

ASP.NET MVC.路由管理器.解决具有类似链接值的路由问题

有几种方法可以解决这个问题。看起来您的特定问题可以通过创建IRouteConstraint的实现来解决。

这将允许您动态覆盖应用程序的默认路由功能。

public class ProductUrlConstraint : IRouteConstraint
{
    public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
    {
        List<string> customPages = new List<string> {"Ferrari", "Porche"};
        if (values[parameterName] != null)
        {
            var slug= values[parameterName].ToString();
            var product = customPages.Where(p => p == slug).FirstOrDefault();
            if(!string.isNullorEmpty(product))
            {
                 HttpContext.Items["customProduct"] = product;
                 return true;
            }
        }
        return false;
    }
}

在路线定义中使用IRouteConstraint的实现,如下所示:

routes.MapRoute(
    name: "ProductRoute",
    url: "{*customProduct}",
    defaults: new {controller = "Product", action = "Index"},
    constraints: new { customProduct= new ProductUrlConstraint() }
);
routes.MapRoute(
    name: "Default",
    url: "{controller}/{action}/{id}",
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);

接下来的操作如下:

public ActionResult Index(string permalink)
{
    var page = HttpContext.Items["customProduct"].ToString();
    //dont forget to check for null :)
    //model/ view logic
}

根据您以后的要求,您可能需要在操作中进行一些自定义字符串处理。

将自定义产品存储在HttpContext中只是一个性能方面的考虑。