说我有以下路线:
routes.MapRoute("Default", "{controller}/{action}/{id}",
new { controller = "Home", action = "Index", id = "" });
Run Code Online (Sandbox Code Playgroud)
让我们说我的控制器有以下方法: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)]属性,但除了他的博客之外我无法在任何地方找到它(当我在我的控制器中尝试时,我的应用程序将无法编译).
Haa*_*ked 12
您现在可以执行以下操作.
protected override void HandleUnknownAction(string actionName) {
//your code here.
}
Run Code Online (Sandbox Code Playgroud)
另一种方法是,你穿上的缺省路由的约束,因此只有符合你的方法知道存在控制器上.然后你可以有另一条路线:
routes.MapRoute("default-action", "{controller}/{actionName}/{id}", new {action="DefaultAction"});
Run Code Online (Sandbox Code Playgroud)
哪个映射到
public ActionResult DefaultAction(string actionName, string id) {
//handle default action
}
Run Code Online (Sandbox Code Playgroud)
这可以获得您正在寻找的结果.
Farooq Kaiser在这个主题上做了一篇关于CodeProject的文章,我觉得它很有用: 处理ASP.NET MVC中的未知操作
我特别喜欢创建"仅查看"页面的技巧(显然应该添加错误处理代码):
protected override void HandleUnknownAction(string actionName)
{
this.View(actionName).ExecuteResult(ControllerContext);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
12047 次 |
| 最近记录: |