【问题标题】:ASP.Net MVC route mappingASP.Net MVC 路由映射
【发布时间】: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

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

【问题讨论】:

    标签: c# asp.net asp.net-mvc routing


    【解决方案1】:

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

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

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

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2012-09-03
              • 2011-04-10
              • 2010-11-08
              • 1970-01-01
              • 1970-01-01
              • 2015-12-26
              • 1970-01-01
              • 2023-03-31
              相关资源
              最近更新 更多