如何防止多个ASP.NET MVC路由映射
本文关键字:MVC 路由 映射 NET ASP 何防止 | 更新日期: 2023-09-27 17:59:06
我有一个ASP.NET MVC路由问题。首先,让我解释一下我的区域设置。这很简单。
Areas
|
+--Foo
|
+--Controllers
|
+--BarController.cs
我在我的区域中有一个名为"Foo"的文件夹和名为"BarController.cs"的控制器。Bar控制器有几个名为"DoStuff1()"、"DoStuff 2()"等的方法。
我的网站使用以下网址:
/foo/bar/15
/foo/bar/dostuff1
/foo/bar/dostuff2
第一个URL需要一个id,并使用Bar控制器中的默认Index()方法来用视图和模型填充网页。
在第二个和第三个URL中,我将它们用于jQueryajax调用。
这是我所在地区注册的代码
context.MapRoute(null, "Foo/Bar/DoStuff1", new
{
action = "DoStuff1",
controller = "Bar"
});
context.MapRoute(null, "Foo/Bar/DoStuff2", new
{
action = "DoStuff2",
controller = "Bar"
});
context.MapRoute(null, "Foo/Bar/{id}", new
{
action = "Index",
controller = "Bar"
});
我的问题是,对于我创建的每个新控制器方法,我都必须在区域注册表文件中添加另一个路由映射。例如,如果我添加方法DoStuff3(),我需要将其添加到区域注册中:
context.MapRoute(null, "Foo/Bar/DoStuff3", new
{
action = "DoStuff3",
controller = "Bar"
});
我如何创建一个通用的路由映射来处理我上面提到的URL,而不需要为新的控制器方法在区域注册文件中添加新的内容?
您可以拉出控制器操作。
这样写URL:
"Foo/Bar/{action}"
此外,您还可以拔出控制器,并写入
"Foo/{controller}/{action}"
在这种情况下,如果没有提供动作参数,action = "Index"
将提供默认值"Index"。
在这种情况下,您需要消除"Foo/Bar/{action}"
和"Foo/Bar/{id}"
之间的歧义。由于匹配是按顺序进行的,因此您需要将id
路由放在第一位,并为id
参数添加一个数字约束。这允许有效的数字ID与之匹配,并允许操作名称跳到下一个路由。你的两条路线看起来是这样的:
context.MapRoute(null, "Foo/Bar/{id}", new
{
action = "Index",
controller = "Bar"
},
new { id = @"'d+" });
context.MapRoute(null, "Foo/Bar/{action}", new
{
action = "Index", //optional default parameter, makes the route fall back to Index if no action is provided
controller = "Bar"
});
MVC模板附带的默认路由适用于大多数所需的路由配置。
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);