6

我有一个 ASP.NET MVC 路由问题。首先,让我解释一下我的区域设置。这很简单。

Areas
|
+--Foo
   |
   +--Controllers
      |
      +--BarController.cs

我在我的区域中有一个名为“Foo”的文件夹和一个名为“BarController.cs”的控制器 Bar 控制器有几个名为“DoStuff1()”、“DoStuff2()”等的方法。

我的网站使用以下 URL:

/foo/bar/15
/foo/bar/dostuff1
/foo/bar/dostuff2

第一个 URL 需要一个 id 并使用 Bar 控制器中的默认 Index() 方法来使用视图和模型填充网页。

在第二个和第三个 URL 中,我将它们用于 jQuery ajax 调用。

这是我的区域注册中的代码

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?

4

2 回答 2

3

您可以拉出控制器动作。

像这样写网址:

"Foo/Bar/{action}"

此外,您也可以拉出控制器,然后编写

"Foo/{controller}/{action}"

在这种情况下,action = "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"
});
于 2013-02-14T18:46:00.433 回答
0

MVC 模板附带的默认路由适用于大多数所需的路由配置。

routes.MapRoute(
                  name: "Default",
                  url: "{controller}/{action}/{id}",
                  defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
            );
于 2013-02-14T18:46:15.390 回答