10

这是我的 global.asax 文件中的两条路线。我试图去第二条路线,我得到一个默认的 404 资源未找到错误。

当我删除第一条路线(在此示例中列出)时,它可以工作。

请问我该如何解决这个问题?

global.asax 代码片段

// GET: /user/PureKrome/Alert/69
routes.MapRoute(
    "User-Alert-Details",
    "user/{displayName}/alert/{alertId}",
    new { controller = "Account", action = "AlertDetails", alertId = 0 });

// GET: /user/PureKrome/Alert/create
routes.MapRoute(
    "User-Alert-Create",
    "user/{displayName}/alert/create",
    new { controller = "Account", action = "AlertCreate" });
4

4 回答 4

20

您的第一条路线是“贪婪”路线,并且很乐意接受“create”作为最后一个参数中的 alertId。看来您希望 alertId 参数仅为数字,因此您应该添加一个约束来告诉路由系统最后一个参数必须是数字。

请参阅本教程

例如:

// GET: /user/PureKrome/Alert/69
routes.MapRoute(
    "User-Alert-Details",
    "user/{displayName}/alert/{alertId}",
    new { controller = "Account", action = "AlertDetails", alertId = 0 },
    new { alertId = @"\d+" });

// GET: /user/PureKrome/Alert/create
routes.MapRoute(
    "User-Alert-Create",
    "user/{displayName}/alert/create",
    new { controller = "Account", action = "AlertCreate" });

请注意,您也可以颠倒路线的顺序,但即使这样做,如果您希望 alertId 始终为数字,您仍应包含正确性约束。

于 2009-03-24T12:36:13.277 回答
1

您希望以相反的方式定义路由,以便完全匹配 oncreate出现在 的无约束匹配之前alertId。那,或者您可以添加一个约束,alertId如 Twisty Maze 所述。

这是因为路由通过尝试从上到下匹配路由来工作。/user/PureKrome/Alert/create匹配User-Alert-Details路线,因为它认为createalertId. 通过切换它们,它只会User-Alert-Create在第 4 段是明确的情况下匹配路线create,如果没有,它将落入User-Alert-Details

为了清楚起见,他们应该这样工作:

// GET: /user/PureKrome/Alert/create
routes.MapRoute(
    "User-Alert-Create",
    "user/{displayName}/alert/create",
    new { controller = "Account", action = "AlertCreate" });

// GET: /user/PureKrome/Alert/69
routes.MapRoute(
    "User-Alert-Details",
    "user/{displayName}/alert/{alertId}",
    new { controller = "Account", action = "AlertDetails", alertId = 0 });  
于 2009-03-24T12:39:32.847 回答
1

如果您还有类似的问题,请在http://haacked.com/archive/2008/03/13/url-routing-debugger.aspx尝试 Phil Haack 的 url 调试器

于 2009-03-24T18:38:01.083 回答
0

问题是您在第一个映射中为控制器和操作指定了默认值。

现在任何传入请求都由第一条路由处理,如果控制器名称丢失,则将其替换为默认值,如果操作名称丢失,则也将其替换为默认值。

所以实际上,当您说http://localhost/SomeRoute 第一个映射器开始行动并将字符串“SomeRoute”视为控制器名称时,它没有找到该操作,因此它使用您指定的默认操作,即“AlertCreate “在你的例子中。所以现在映射器试图在“SomeRoute”控制器中找到一个名为 AlertCreate 的动作。

底线是第二个映射不会生效,因为第一个映射正在处理您的所有路由请求。(因为您指定了默认值)

于 2016-08-03T20:14:15.330 回答