首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在ASP.NET MVC中创建返回不带控制器引用的URL的路由?

问如何在ASP.NET MVC中创建返回不带控制器引用的URL的路由?
EN

Stack Overflow用户
提问于 2010-02-07 13:55:50
回答 2查看 847关注 0票数 1

我有一个名为DefaultController的控制器。在这个控制器中,我有相当于静态页面的视图。

URL类似于www.site.com/Default/PageName

是否可以创建一条路由,将这些URL格式化为:

www.site.com/PageName

我希望避免为每一个都创建控制器。另一种方法是在根目录中创建.aspx页面,但我是否可以为这些页面创建路由,即:

www.site.com/PageName.aspx变成www.site.com/PageName?

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-02-07 14:08:45

您可以为DefaultController上的PageName操作创建显式路由,如下所示:

代码语言:javascript
复制
routes.MapRoute(
    "PageName",
    "pagename",
    new { controller = "DefaultController", action = "PageName" }
);

您必须将此路由放在默认MVC路由之前。这种方法的最大缺点是您必须为每个静态页面创建一条路由。

另一种方法是在默认MVC路由之后添加一个额外的路由:

代码语言:javascript
复制
routes.MapRoute(
    "DefaultController",
    "{page}/{*path}",
    new { controller = "DefaultController", action = "{page}" }
);

这种方法的缺点是,该规则将处理所有的URL,甚至是那些通常会返回404的URL。

票数 2
EN

Stack Overflow用户

发布于 2010-02-07 20:25:20

第一种方法

创建捕获动作的路由:

代码语言:javascript
复制
routes.MapRoute(
    "Catcher1",
    "{action}",
    new { controller = "Default", action = string.Empty });

但这意味着你必须在你的默认控制器上创建同样多的控制器动作。

第二种方法

如果您也想避免这种情况,而只有一个controller+action,那么可以这样写一条路由:

代码语言:javascript
复制
routes.MapRoute(
    "Catcher2",
    "{path}",
    new { controller = "Default", action = "PageName", path = string.Emtpy },
    new { path = @"[a-zA-Z0-9]+" });

此路由还定义了路由约束,因此它将仅捕获在第一路由段中实际具有某些内容的那些路由。您可以定义此约束以仅捕获您需要的那些请求(即,path = "Result|Search|Whatever")

那么你的DefaultController应该是这样的:

代码语言:javascript
复制
public ActionResult PageName(string path)
{
    // code goes here
}

第二种方法似乎非常可行,但我不推荐它,因为所有逻辑都必须通过这个控制器操作(对于这些类型的请求)。最好将这些操作分成符合逻辑的操作。那些实际上做相同事情的(这样它们就不会有一堆switch语句或类似的语句)将被定义为单独的路由(如果它们不能使用一个单独的路由来完成)。

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

https://stackoverflow.com/questions/2216106

复制
相关文章

相似问题

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