3

我有这个 MVC4 控制器(ControllerB):

public class MyControllerB : Controller
{
    public bool Check(string actionName, ControllerBase controllerBase)
    {
        ControllerContext controllerContext = new ControllerContext(this.ControllerContext.RequestContext, controllerBase);

        ...
    }
}

我正在从“ControllerA”调用 ControllerB 的 Check 方法,如下所示:

bool b = new MyControllerB().Check("Index", this);

我得到Object reference not set to an instance of an object因为this.ControllerContext是空的。

如果我将 Check 方法移动到 ControllerA,它就可以正常工作。但我需要这种方法在不同的控制器中。如何修复我的代码以使 ``this.ControllerContext` 不会为空?

4

1 回答 1

5

为空,ControllerContext因为您是ControllerB从 手动创建实例ControllerA

通常,IController实例是由注册的IControllerFactory,通常是System.Web.Mvc.DefaultControllerFactory. 控制器工厂将new()正确初始化实例和初始化设置。

正如@DZL 所说,让两个控制器子类化一个类通常要好得多,BaseController该类可以具有共享的初始化以及共享的属性和方法。

我不了解您要执行的操作的业务逻辑,但这是使用 2 个控制器中的基类的代码示例:

namespace MyNamespace.Controllers
{
    public class MyControllerBase : Controller
    {
        public bool Check(string actionName, ControllerBase controllerBase)
        {
            ControllerContext controllerContext = new ControllerContext(this.ControllerContext.RequestContext, controllerBase);
            return false;
        }
    }
    public class MyControllerA : MyControllerBase
    {
        ActionResult Index()
        {
            bool b = base.Check("Index", this);
            return View();
        }
    }
    public class MyControllerB : MyControllerBase
    {
        ActionResult Index()
        {
            bool b = base.Check("Index", this);
            return View();
        }
    }
}

如果你真的想完全按照你的要求做,你必须打电话IControllerFactory.CreateController(requestContext, controllerName)而不是打电话new ControllerB(),但这是一种非常复杂的做事方式 - 我不推荐它。

于 2013-10-01T14:43:00.830 回答