.net URL路由在2个路由规则之间混淆

fiei3ece  于 2023-02-14  发布在  .NET
关注(0)|答案(1)|浏览(212)

我的网站有两个相似的路由规则,一个是分类规则,另一个是品牌规则

app.MapControllerRoute(
    name: "CategoryPage",
    pattern: "shop/{controller}/{id}/{pageNumber}/{pageSize}/{*categoryName}",
    defaults: new { area = "shop", controller = "category", action = "index" });

app.MapControllerRoute(
    name: "BrandPage",
    pattern: "shop/{controller}/{id}/{pageNumber}/{pageSize}/{*brandName}",
    defaults: new { area = "shop", controller = "brand", action = "index" });

唯一不同的是控制器和品牌/类别名称。
我的网址应该看起来像这样.

shop/Category/79/1/80/Clothing-Accessories
shop/Brand/79/1/80/my-brand

但是我的列表中的第二条路由规则总是显示为

shop/Brand/159/1/80?brandName=Anchor-Crew

我原以为用不同的控制器名称它可以告诉使用哪一个,但似乎不是这样。一个可能的解决办法是我给予他们两个类似的名称,如'鼻涕虫'。
更新以包括控制器

public async Task<IActionResult> Index([FromRoute] long id, int pageNumber, int pageSize, string brandName)
    {
        PaginatedList<Product> products = GetProducts(id, pageNumber, pageSize);
        Brand brand = await _brandService.GetAsync(id);

public async Task<IActionResult> Index([FromRoute]long id, int pageNumber, int pageSize, string categoryName)
    {
        Category? category = await _categoryService.Get(id, true);
mutmk8jj

mutmk8jj1#

我认为以下引用的文件在这里是适用的:
常规路由用于控制器和视图。默认路由:

app.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}");

此Map:

  • 仅基于控制器和操作名称。
  • 不基于名称空间、源文件位置或方法参数

布线不考虑操作参数名称,因此从布线的Angular 来看,您定义了两条布线,这两条布线在仅使用段时是相同的。
按照定义顺序应用常规路线(参见文档中的相应警告):
MapControllerRouteMapAreaRoute根据调用顺序自动为其端点分配顺序值。这模拟控制器的长期行为,而路由系统不提供与旧路由实现相同的保证。
因此改变路由定义顺序具有切换所选控制器的观察效果。
似乎提供最后一个参数作为查询字符串参数可以让工艺路线选择正确的控制器(在文档中找不到原因)。
您可以尝试对先前声明的路由使用“更具体”的路由,以显式匹配所需的控制器:

// remove controller template param and hardcode controller 
app.MapControllerRoute(
    name: "CategoryPage",
    pattern: "shop/category/{id}/{pageNumber}/{pageSize}/{*categoryName}",
    defaults: new { area = "shop", controller = "category", action = "index" });

app.MapControllerRoute(
    name: "BrandPage",
    pattern: "shop/{controller}/{id}/{pageNumber}/{pageSize}/{*brandName}",
    defaults: new { area = "shop", controller = "brand", action = "index" });

相关问题