提问人:Nikola 提问时间:10/14/2023 最后编辑:Nikola 更新时间:10/14/2023 访问量:34
ASP.NET MVC 5 - 映射控制器路由和映射嵌套操作的正确方法
ASP.NET MVC 5 - Mapping controller route and proper way to map nested actions
问:
我有一个名为控制器的控制器,它具有通常的(默认模板生成的)操作:Expense
Expense/Index
Expense/Create/{id}
Expense/Details/{id}
Expense/Edit/{id}
我还有一个名为 的控制器,其操作(来自添加 和 参数的默认模板)映射到:Expense_Status
string serialNumber
Date 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 }
);
}
}
我想知道的是:
如何删除/忽略与“默认”映射匹配的路径,并仅保留相似的路径?
Expense_Status/{action}/{id}
Expense/123/Status/Edit/11-2020
这是映射这种对象的正确方法吗,因为有多个?我看到了这篇文章 MVC 分层路由 ,我喜欢我可以在控制器中拥有操作,但不喜欢我必须将所有操作“硬编码”为路由配置.cs中的单独路由映射的事实
Expense
Statuses
Expense_Status
Expense
我尝试将以下内容添加到路由配置.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)
{
...
}
}
,但我不喜欢我必须在路由中指定控制器名称的事实。
答: 暂无答案
评论