从Action调用Action,然后继续Action

时间:2010-11-02 02:58:18

标签: asp.net-mvc controllers

我想我误解了一些关于MVC的事情。我正在尝试执行以下操作:

public class ControllerA : Controller
{
    public ActionResult Index()
    {
        // do code

        // perform action on ControllerB - something like:
        // RedirectToAction("Action", "ControllerB");

        // CARRY ON with more code
    }
}

public class ControllerB : Controller
{
    public void Action()
    {
        // do code
    }
}

显然RedirectToAction("Action", "ControllerB");无效。那我该怎么做?我想我可以让所有需要使用Action()的控制器继承自ControllerB,但感觉这是一个非常糟糕的方法。请帮忙!

3 个答案:

答案 0 :(得分:3)

您必须从RedirectToAction()

返回ActionResult
return RedirectToAction("Action", "ControllerB");
如果您希望RedirectToAction实际重定向到某个操作,则需要执行

。在您澄清“不工作”对您意味着什么之后,我认为您应该让所有控制器都从基础继承。这是一种非常标准的方法。

public class ControllerA : ControllerB
{
    public ActionResult Index()
    {
        // do code

        Action();

        // CARRY ON with more code
    }
}

public class ControllerB : Controller
{
    public void Action()
    {
        // do code
    }
}

答案 1 :(得分:0)

我相信您当前正在执行的控制器是该类的一个实例,因此您需要创建一个控制器B的实例才能执行任何操作,因此您尝试在那里执行的操作实际上并不是真的没有黑客的工作。

我认为有两种方法可以更好地得到我认为你所追求的结果:

1)创建一个'ControllerBase'类并让所有控制器继承它,而不是从'Controller'继承,然后你可以添加到基类中的任何共享代码(或许作为静态方法),然后所有控制器都可以访问它一个好的,容易的成员。

2)由于MVC会创建一个直接的DLL,你可以根据需要添加新的类,例如添加一个像'Globals'这样的新项目文件夹添加一个名为'Funcs'的新类文件,你有一个静态库你可以从任何地方访问,Funcs.SendEmail();等

如果我没有标记好的话!无论如何,快乐的编码嘿

答案 2 :(得分:0)

我已经从控制器工厂向控制器注入了一个工厂方法作为委托(Func CreateController),并使用它来创建子控制器,例如在这种情况下。有很多方法可以实现您的目标,但我认为这可能是获得您想要的工作的快捷方式。