提问人:Ryan Eastabrook 提问时间:8/15/2008 最后编辑:Soham DasguptaRyan Eastabrook 更新时间:3/19/2019 访问量:22346
ASP.Net MVC 路由映射
ASP.Net MVC route mapping
问:
我是 MVC(和 ASP.Net 路由)的新手。我正在尝试映射到一个名为 .*.aspx
PageController
routes.MapRoute(
"Page",
"{name}.aspx",
new { controller = "Page", action = "Index", id = "" }
);
上面的代码不会将 *.aspx 映射到吗?当我运行它并键入任何 .aspx 页面时,出现以下错误:PageController
找不到路径“/Page.aspx”的控制器,或者它未实现 IController 接口。 参数名称:controllerType
我在这里有什么不做的吗?
答:
不确定您的控制器的外观,该错误似乎指向它找不到控制器的事实。在创建 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.");
}
}
}
我只是回答了我自己的问题。我有向后路由(默认在页面上方)。下面是正确的顺序。所以这就引出了下一个问题......“默认”路由如何匹配(我假设他们在这里使用正则表达式)“页面”路由?
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
);
我只是回答了我自己的问题。我有 向后路由(默认值为 上页)。
是的,您必须将所有自定义路由置于默认路由之上。
所以这就引出了下一个问题...... “默认”路由如何匹配(I 假设他们使用正则表达式 这里)“页面”路线?
默认路由基于我们所说的约定优先于配置进行匹配。Scott Guthrie 在他的第一篇关于 ASP.NET MVC 的博客文章中很好地解释了这一点。我建议你通读它以及他的其他帖子。请记住,这些都是基于第一个 CTP 发布的,并且框架已更改。您还可以在 asp.net 网站上找到 Scott Hanselman ASP.NET MVC 的网络广播。
- http://weblogs.asp.net/scottgu/archive/2007/11/13/asp-net-mvc-framework-part-1.aspx
- http://www.asp.net/MVC/
在 Rob Conery 的 MVC Storefront 截屏视频中,他遇到了这个确切的问题。如果您有兴趣,大约在 23 分钟左右。
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 测试路由
评论