我正在构建一个预定作业 Controller - 这些作业将调用一个 Controller 和一个捕获结果的 Action。我宁愿所有这些都发生在后端,而不涉及 http 调用。
这有点像单元测试中发生的事情——例如:
var controller = new TestController();
var result = controller.Index("TestParameter") as ViewResult;
这个例子中的问题是 Controller 和 Action 不是动态的,有谁知道如何初始化 Controller 并调用一个带有 Controller 名称和 Action 作为字符串参数的 Action ?比如——
public ActionResult run(string controllerName, string actionName)
{
var controller = new Controller(controllerName);
var result = controller.action(actionName).("TestParameter") as ViewResult;
return Content(result);
}
最佳答案
使用 ControllerFactory
和 ActionDescriptor
来动态执行 Action :
public ActionResult Run(string controllerName, string actionName)
{
// get the controller
var ctrlFactory = ControllerBuilder.Current.GetControllerFactory();
var ctrl = ctrlFactory.CreateController(this.Request.RequestContext, controllerName) as Controller;
var ctrlContext = new ControllerContext(this.Request.RequestContext, ctrl);
var ctrlDesc = new ReflectedControllerDescriptor(ctrl.GetType());
// get the action
var actionDesc = ctrlDesc.FindAction(ctrlContext, actionName);
// execute
var result = actionDesc.Execute(ctrlContext, new Dictionary<string, object>
{
{ "parameterName", "TestParameter" }
}) as ActionResult;
// return the other action result as the current action result
return result;
}
参见 MSDN
关于c# - ASP.NET MVC 初始化 Controller 并以编程方式调用操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28967562/