ASP.Net MVC 路由映射

ASP.Net MVC route mapping

提问人:Ryan Eastabrook 提问时间:8/15/2008 最后编辑:Soham DasguptaRyan Eastabrook 更新时间:3/19/2019 访问量:22346

问:

我是 MVC(和 ASP.Net 路由)的新手。我正在尝试映射到一个名为 .*.aspxPageController

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

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

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

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

C# asp.net ASP.NET-MVC 路由

评论


答:

0赞 Dale Ragan 8/15/2008 #1

不确定您的控制器的外观,该错误似乎指向它找不到控制器的事实。在创建 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.");
        }
    }
}
6赞 Ryan Eastabrook 8/15/2008 #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
        );
6赞 Dale Ragan 8/15/2008 #3

我只是回答了我自己的问题。我有 向后路由(默认值为 上页)。

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

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

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

1赞 Chris Farmer 8/15/2008 #4

在 Rob Conery 的 MVC Storefront 截屏视频中,他遇到了这个确切的问题。如果您有兴趣,大约在 23 分钟左右。

0赞 Dayi Chen 1/30/2011 #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 测试路由