ASP.NET MVC 5 - 映射控制器路由和映射嵌套操作的正确方法

ASP.NET MVC 5 - Mapping controller route and proper way to map nested actions

提问人:Nikola 提问时间:10/14/2023 最后编辑:Nikola 更新时间:10/14/2023 访问量:34

问:

我有一个名为控制器的控制器,它具有通常的(默认模板生成的)操作:Expense

  • Expense/Index
  • Expense/Create/{id}
  • Expense/Details/{id}
  • Expense/Edit/{id}

我还有一个名为 的控制器,其操作(来自添加 和 参数的默认模板)映射到:Expense_Statusstring serialNumberDate month

  • Expense/{serialNumber}/Status/{action}/{month},例如 Expense/123/Status/Edit/11-2020

我的 App_Start/ RouteConfig.cs如下:

    public class RouteConfig
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            routes.Ignore(url: "Expense_Status{pathInfo}", constraints: new { pathInfo = "."});

            routes.MapMvcAttributeRoutes();

            routes.MapRoute(
                name: "ExpenseStatus",
                url: "Expense/{serialNumber}/Status/{action}/{month}",
                defaults: new { controller = "Expense_Status", action = "Index", month = UrlParameter.Optional }
                );

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

我想知道的是:

  1. 如何删除/忽略与“默认”映射匹配的路径,并仅保留相似的路径?Expense_Status/{action}/{id}Expense/123/Status/Edit/11-2020

  2. 这是映射这种对象的正确方法吗,因为有多个?我看到了这篇文章 MVC 分层路由 ,我喜欢我可以在控制器中拥有操作,但不喜欢我必须将所有操作“硬编码”为路由配置.cs中的单独路由映射的事实ExpenseStatusesExpense_StatusExpense

我尝试将以下内容添加到路由配置.cs中,但没有解决问题1):

routes.Ignore(url: "Expense_Status{pathInfo}", constraints: new { pathInfo = "."});

Expense_Status/等....仍可访问


尝试使用这篇文章中的解决方案从默认路由 C# MVC 中排除控制器,但是如何在不为要排除的每个控制器编写多个 MapRoute -ings 的情况下排除多个控制器?

例如

routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
                constraints: new NotEquals("Expense_Status")
            );

routes.MapRoute(
                name: "AnotherDefault",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
                constraints: new NotEquals("<name_of_other_controller_to_exclude>")
            );

似乎有太多的重复和代码污染。

编辑1:还可以选择使用属性路由,如下所示:

public class ExpenseController : Controller
{
    // eg: /Expense/123/Status/Edit/11-2020
    [Route(“Expense/{serialNumber}/Status/Edit/{month}”)]
    public ActionResult StatusEdit(string serialNumber, string month)
    {
        ...
    }
}

,但我不喜欢我必须在路由中指定控制器名称的事实。

asp.net-mvc-routing

评论


答: 暂无答案