c# - ASP.NET MVC 初始化 Controller 并以编程方式调用操作

标签 c# asp.net-mvc asp.net-mvc-4

我正在构建一个预定作业 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);
}

最佳答案

使用 ControllerFactoryActionDescriptor 来动态执行 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/

相关文章:

c# - XDocument 将制表符更改为空格

c# - 从 C++ 传递到 C# 的字符串打印空白

c# - ViewModel 替换复杂的匿名对象

asp.net-mvc - 从类中删除必需的属性,但MVC3仍然不会在文本框中没有值的情况下发布表单

asp.net-mvc-4 - 仅限管理员用户使用 Glimpse

razor - MVC4 Razor 自定义 View 定位器

c# - System.DateTime.Year(及其其他属性)是如何实现的?

c# - 将 C# GUI 组件封装在 DLL 中

asp.net-mvc - ASP.NET MVC 3 和 4 之间的区别?

json - Json.Encode 缺少 mvc 4 程序集引用