3

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

public ActionResult DoSomething()
{
    ...
}

public ActionResult SoSomethingAgain()
{
    ...
}

我想让两个请求都执行相同的操作。

也许是别名……

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

什么是正确的方法?

4

3 回答 3

7

如果我没看错,你可以这样做:

public ActionResult DoSomething()
{
    ...
}

public ActionResult SoSomethingAgain()
{
    return DoSomething();
}
于 2013-06-19T19:56:53.213 回答
5

只需SoSomethingAgain这样做:

return DoSomething();

当您在应用程序开始时设置路由时,您唯一的其他选择是Route为该控制器构建特定的。这将比它的价值多得多。

于 2013-06-19T19:54:30.220 回答
2

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

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

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

routes.MapRoute(
  name: "SoSomethingAgainRoute",
  url: "{controller}/SoSomethingAgain/{id}",
  defaults: new { controller = "Home", action = "DoSomething", id = UrlParameter.Optional }
);
于 2013-06-19T21:28:30.423 回答