ASP.Net MVC 路由映射

Posted

技术标签:

【中文标题】ASP.Net MVC 路由映射【英文标题】:ASP.Net MVC route mapping 【发布时间】:2010-09-05 22:20:30 【问题描述】:

我是 MVC(和 ASP.Net 路由)的新手。我正在尝试将*.aspx 映射到名为PageController 的控制器。

routes.MapRoute(
   "Page",
   "name.aspx",
   new  controller = "Page", action = "Index", id = "" 
);

上面的代码不会将 *.aspx 映射到 PageController 吗?当我运行它并输入任何 .aspx 页面时,我收到以下错误:

找不到路径“/Page.aspx”的控制器,或者它没有实现 IController 接口。 参数名称:controllerType

有什么我没有在这里做的吗?

【问题讨论】:

【参考方案1】:

我刚刚回答了我自己的问题。我有 向后的路线(默认为 上一页)。

是的,您必须将所有自定义路由放在默认路由之上。

所以这就引出了下一个问题…… “默认”路由如何匹配(我 假设他们使用正则表达式 这里)“页面”路线?

默认路由匹配基于我们所说的约定优于配置。 Scott Guthrie 在他关于 ASP.NET MVC 的第一篇博文中很好地解释了这一点。我建议您通读它以及他的其他帖子。请记住,这些是基于第一个 CTP 发布的,并且框架已更改。您还可以在 Scott Hanselman 的 asp.net 网站上找到有关 ASP.NET MVC 的网络广播。

http://weblogs.asp.net/scottgu/archive/2007/11/13/asp-net-mvc-framework-part-1.aspx http://www.asp.net/MVC/

【讨论】:

【参考方案2】:

我刚刚回答了我自己的问题。我有向后的路线(默认在页面上方)。下面是正确的顺序。所以这带来了下一个问题......“默认”路由如何匹配(我假设他们在这里使用正则表达式)“页面”路由?

routes.MapRoute(
            "Page",
            "Name.aspx",
            new  controller = "Page", action = "Display", id = "" 
        );

        routes.MapRoute(
            "Default",                                              // Route name
            "controller/action/id",                           // URL with parameters
            new  controller = "Home", action = "Index", id = ""   // Parameter defaults
        );

【讨论】:

【参考方案3】:

在 Rob Conery 的 MVC Storefront screencasts 之一上,他遇到了这个确切的问题。如果您有兴趣,它大约在 23 分钟左右。

【讨论】:

【参考方案4】:

不确定您的控制器的外观,该错误似乎指向它找不到控制器的事实。创建 PageController 类后,您是否继承了 Controller ? PageController 是否位于 Controllers 目录中?

这是我在 Global.asax.cs 中的路线

routes.MapRoute(
    "Page", 
    "Page.aspx", 
    new  controller = "Page", action = "Index", id = "" 
);

这是我的控制器,它位于 Controllers 文件夹中:

using System.Web.Mvc;

namespace MvcApplication1.Controllers

    public class PageController : Controller
    
        public void Index()
        
            Response.Write("Page.aspx content.");
        
    

【讨论】:

【参考方案5】:
public class AspxRouteConstraint : IRouteConstraint

    #region IRouteConstraint Members

    public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
    
        return values["aspx"].ToString().EndsWith(".aspx");
    

    #endregion

为所有aspx注册路由

  routes.MapRoute("all", 
                "*aspx",//catch all url 
                new  Controller = "Page", Action = "index" , 
                new AspxRouteConstraint() //return true when the url is end with ".aspx"
               );

你可以通过MvcRouteVisualizer测试路由

【讨论】:

以上是关于ASP.Net MVC 路由映射的主要内容,如果未能解决你的问题,请参考以下文章

IIS 6 上的 ASP.NET MVC - 通配符映射 - 传入请求与任何路由都不匹配

具有固定 URI 的 ASP.NET 路由不映射查询字符串参数

使用 MVC Contrib 测试 ASP.NET MVC 路由

ASP.NET MVC教程五:ASP.NET MVC中的路由

[十] ASP.NET Core MVC 中的路由

asp.net core 系列 5 MVC框架路由(上)