说我有以下路线:
routes.MapRoute("Default", "{controller}/{action}/{id}", new { controller = "Home", action = "Index", id = "" });
让我们说我的控制器有以下方法:Index(Int32 id)
和Edit(Int32 id)
.
所以,/MyController/Index/1
是该路线有效的URL.也是/MyController/Edit/1
但是,如果收到的URL正确映射到我的控制器而不是现有操作,那么如何定义要执行的"默认操作"而不是让MVC框架抛出错误屏幕?
基本上我想要URL /MyController/Preview/1
并/MyController/Whatever/1
执行我提前指定的操作,此时{action}令牌无法映射到我的控制器上的现有操作.
我看到Codeplex上的MvcContrib项目有一个属性,可以使它与ConventionController一起使用,但我现在想用纯MS ASP.NET MVC保留它.
我也看到Fredrik提到了一个[ControllerAction(DefaultAction = true)]
属性,但除了他的博客之外我无法在任何地方找到它(当我在我的控制器中尝试时,我的应用程序将无法编译).
您现在可以执行以下操作.
protected override void HandleUnknownAction(string actionName) { //your code here. }
另一种方法是,你穿上的缺省路由的约束,因此只有符合你的方法知道存在控制器上.然后你可以有另一条路线:
routes.MapRoute("default-action", "{controller}/{actionName}/{id}", new {action="DefaultAction"});
哪个映射到
public ActionResult DefaultAction(string actionName, string id) { //handle default action }
这可以获得您正在寻找的结果.
Farooq Kaiser在这个主题上做了一篇关于CodeProject的文章,我觉得它很有用: 处理ASP.NET MVC中的未知操作
我特别喜欢创建"仅查看"页面的技巧(显然应该添加错误处理代码):
protected override void HandleUnknownAction(string actionName) { this.View(actionName).ExecuteResult(ControllerContext); }