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
。我不知道如何建立自定义路线管理器来解决这个问题,需要专家的帮助。请告诉我问题是否清楚。
有几种方法可以解决这个问题。看起来您的特定问题可以通过创建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中只是一个性能方面的考虑。