如何使用MVC在同一个控制器中复制动作

时间:2013-06-19 19:51:49

标签: c# asp.net-mvc

我在一个控制器中有2个动作

public ActionResult DoSomething()
{
    ...
}

public ActionResult SoSomethingAgain()
{
    ...
}

我希望两个请求都采取相同的行动。

也许是别名......

[ie. SoSomethingAgain]
public ActionResult DoSomething()
{
    ...
}

什么是正确的方法?

3 个答案:

答案 0 :(得分:7)

如果我正确读到这个,你可以这样做:

public ActionResult DoSomething()
{
    ...
}

public ActionResult SoSomethingAgain()
{
    return DoSomething();
}

答案 1 :(得分:5)

SoSomethingAgain中执行此操作:

return DoSomething();

当您在应用程序启动时设置路由时,您唯一的另一个选择是为该控制器构建特定的Route。这将是一项比它值得多的工作。

答案 2 :(得分:2)

如果SoSomethingAgain是被调用的动作,那么前两个答案将运行DoSomething中的代码,但控制器动作和上下文仍然是SoSomethingAgain。这意味着DoSomething中的返回View()语句将查找SoSomethingAgain视图。

同样,管道将使用SoSomethingAgain上定义的过滤器,而不是DoSomething上的过滤器。如果在DoSomething上放置[授权]过滤器,则可以看到此信息。如果您点击DoSomething操作,系统将提示您登录,但如果您点击SoSomethingElse操作,则不会提示您。

也许这就是你想要的,也许不是。如果不是,并且您希望同时拥有DoSomething网址和SoSomethingElse网址,但两者都运行相同的代码,那么请删除SoSomethingElse控制器操作,并添加自定义路由(在默认路由之前)。

routes.MapRoute(
  name: "SoSomethingAgainRoute",
  url: "{controller}/SoSomethingAgain/{id}",
  defaults: new { controller = "Home", action = "DoSomething", id = UrlParameter.Optional }
);