首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >ASP.NET MVC -捕获所有路由和默认路由

ASP.NET MVC -捕获所有路由和默认路由
EN

Stack Overflow用户
提问于 2010-10-23 05:25:23
回答 5查看 74.1K关注 0票数 73

为了让我的应用程序正确地产生404错误,我在路由表的末尾实现了一个catch all路由,如下所示:

代码语言:javascript
复制
 routes.MapRoute(
            "NotFound", _
           "{*url}", _
           New With {.controller = "Error", .action = "PageNotFound"} _
       )

但是,为了让它正常工作,我必须删除默认路由:

代码语言:javascript
复制
{controller}/action/{id}

但现在已经删除了默认设置,我的大多数操作链接都不再有效,我找到的让它们重新工作的唯一方法就是为每个控制器/操作添加单独的路由。

有没有一种更简单的方法来实现这一点,而不是为每个控制器/操作添加一个路由?

是否可以创建默认路由,使其在用户尝试导航到未知路由时仍允许catch all路由工作?

EN

回答 5

Stack Overflow用户

发布于 2011-01-12 19:29:38

使用路由约束

在您的情况下,您应该定义默认路由{controller}/{action}/{id}并对其施加约束。可能与控制器名称有关,甚至可能与操作有关。然后将所有的捕获放在它后面,它应该可以很好地工作。

因此,当有人请求一个未满足约束的资源时,捕获所有路由将匹配该请求。

所以。首先使用路由约束定义默认路由,然后定义后面的全部捕获路由:

代码语言:javascript
复制
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" }
);
票数 111
EN

Stack Overflow用户

发布于 2010-10-23 05:32:01

代码语言:javascript
复制
//this catches all  requests
routes.MapRoute(
    "Error",
    "{*.}",
     new { controller = "PublicDisplay", action = "Error404" } 
);

将此路由添加到路由表的末尾

票数 23
EN

Stack Overflow用户

发布于 2010-10-23 05:53:14

嗯,我发现没有好的方法来做到这一点。我已经将customErrorsredirectMode属性设置为ResponseRewrite

代码语言:javascript
复制
<customErrors mode="On" defaultRedirect="~/Shared/Error" redirectMode="ResponseRewrite">
    <error statusCode="404" redirect="~/Shared/PageNotFound"/>
</customErrors>

这给了我想要的行为,但不显示格式化的页面。

对我来说,这是做得不好,就搜索引擎优化而言。然而,我觉得我缺少一个解决方案,因为这正是我想要发生的事情。URL仍然保留在失败的页面上,并抛出404。在Firebug中检查stackoverflow.com/fail。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4001081

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档