说我有以下路线:
routes.MapRoute("Default", "{controller}/{action}/{id}",
new { controller = "Home", action = "Index", id = "" });
让我们说我的控制器有以下方法:Index(Int32 id)
和Edit(Int32 id)
。
因此/MyController/Index/1
是该路线的有效网址。 /MyController/Edit/1
但是,如果收到的URL正确映射到我的控制器而不是现有操作,如何定义“默认操作”来执行而不是让MVC框架抛出错误屏幕?
基本上,我希望URL /MyController/Preview/1
和/MyController/Whatever/1
执行我提前指定的操作,此时{action}令牌无法映射到我的控制器上的现有操作。
我看到Codeplex上的MvcContrib项目有一个属性可以使它与ConventionController一起使用,但我现在想用纯MS ASP.NET MVC保留它。
我也看到Fredrik提到了一个[ControllerAction(DefaultAction = true)]
属性,但除了他的博客之外我在其他任何地方都找不到它(当我在我的控制器中尝试时,我的应用程序将无法编译)
答案 0 :(得分:12)
您现在可以执行以下操作。
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
}
这可以获得您正在寻找的结果。
答案 1 :(得分:8)
Farooq Kaiser在这个主题上写了一篇关于CodeProject的文章,我觉得它很有用: Handling Unknown Actions in ASP.NET MVC
我特别喜欢创建“仅查看”页面的技巧(显然应该添加错误处理代码):
protected override void HandleUnknownAction(string actionName)
{
this.View(actionName).ExecuteResult(ControllerContext);
}