我需要手动实例化一些控制器,因此有以下代码:
var controller = Activator.CreateInstance(typeof(AccountController),
repository) as AccountController;
在 AccountController 我有一个类似的方法:
[AllowAnonymous]
[HttpPost]
public ApiJsonResult LogOn(LogOnAccountDto model)
{
ValidateModel(model);
if (ModelState.IsValid)
{
//...
}
}
我希望我的 ModelState.IsValid 工作,因此我调用 ValidateModel 并将模型传递给它。
这失败了,显然是因为未设置 controlContext。我收到此错误:
值不能为空。参数名称:controllerContext 描述:当前Web请求执行过程中发生了未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。
异常详细信息:System.ArgumentNullException:值不能为空。参数名称:controllerContext
那么,如何在代码中手动实例化 IController - 以便“一切”正常工作?
提前致谢。
那么,我为什么需要这个? 我正在玩一些“在线战略游戏”的架构和游戏逻辑想法。
我有一个 ASP.NET MVC 4 (Preview) 应用程序,这是我的网络版游戏。这个想法是,游戏也应该通过 NATIVE 应用程序在 Windows Phone、iPhone 等设备上玩。因此,我的游戏需要一些 API(某种通过 http/json 通信的 REST 服务)。由于此 API 将是游戏的公共接口,因此所有游戏逻辑当然都位于此 API 中。
因此,我想在游戏的“网页版”和“移动版”中都使用这个 API。我已将此 API 实现为 ASP.NET MVC 4(预览版)中的一个区域。我的第一个想法实际上是从我的“网络版本”到 API 执行 httpwebrequest,所以我完全按照“移动版本”的方式使用 API。但后来我想,实际上手动实例化控制器可能会更好,以避免我从“正确的方式”调用 API 中获得的所有 json/web 调用开销。
所以这就是我现在在这里的原因,我想在代码中手动实例化我的控制器,因为我想在它们中使用确切的逻辑。
说得通?如果你有更好的想法,请告诉我——我这样做是为了学习它,而不是生产真正的产品——至少这不是现在的目标——现在我只是想学习一些新东西:)