为了让我的应用程序正确地产生404错误,我在路由表的末尾实现了一个catch all路由,如下所示:
routes.MapRoute(
"NotFound", _
"{*url}", _
New With {.controller = "Error", .action = "PageNotFound"} _
)
但是,为了让它正常工作,我必须删除默认路由:
{controller}/action/{id}
但现在已经删除了默认设置,我的大多数操作链接都不再有效,我找到的让它们重新工作的唯一方法就是为每个控制器/操作添加单独的路由。
有没有一种更简单的方法来实现这一点,而不是为每个控制器/操作添加一个路由?
是否可以创建默认路由,使其在用户尝试导航到未知路由时仍允许catch all路由工作?
发布于 2011-01-12 19:29:38
使用路由约束
在您的情况下,您应该定义默认路由{controller}/{action}/{id}
并对其施加约束。可能与控制器名称有关,甚至可能与操作有关。然后将所有的捕获放在它后面,它应该可以很好地工作。
因此,当有人请求一个未满足约束的资源时,捕获所有路由将匹配该请求。
所以。首先使用路由约束定义默认路由,然后定义后面的全部捕获路由:
routes.MapRoute(
"Default",
"{controller}/{action}/{id}",
new { controller = "Home", action = "Index", id = UrlParameter.Optional },
new { controller = "Home|Settings|General|..." } // this is basically a regular expression
);
routes.MapRoute(
"NotFound",
"{*url}",
new { controller = "Error", action = "PageNotFound" }
);
发布于 2010-10-23 05:32:01
//this catches all requests
routes.MapRoute(
"Error",
"{*.}",
new { controller = "PublicDisplay", action = "Error404" }
);
将此路由添加到路由表的末尾
发布于 2010-10-23 05:53:14
嗯,我发现没有好的方法来做到这一点。我已经将customErrors
的redirectMode
属性设置为ResponseRewrite
。
<customErrors mode="On" defaultRedirect="~/Shared/Error" redirectMode="ResponseRewrite">
<error statusCode="404" redirect="~/Shared/PageNotFound"/>
</customErrors>
这给了我想要的行为,但不显示格式化的页面。
对我来说,这是做得不好,就搜索引擎优化而言。然而,我觉得我缺少一个解决方案,因为这正是我想要发生的事情。URL仍然保留在失败的页面上,并抛出404。在Firebug中检查stackoverflow.com/fail。
https://stackoverflow.com/questions/4001081
复制相似问题