如何在没有其他操作匹配的情况下为我的Controller设置“默认操作”?

时间:2008-11-18 22:42:14

标签: asp.net-mvc

说我有以下路线:

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)]属性,但除了他的博客之外我在其他任何地方都找不到它(当我在我的控制器中尝试时,我的应用程序将无法编译)

2 个答案:

答案 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);
}
相关问题