Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.NET MVC初始化控制器并以编程方式调用操作_C#_Asp.net Mvc_Asp.net Mvc 4 - Fatal编程技术网

C# ASP.NET MVC初始化控制器并以编程方式调用操作

C# ASP.NET MVC初始化控制器并以编程方式调用操作,c#,asp.net-mvc,asp.net-mvc-4,C#,Asp.net Mvc,Asp.net Mvc 4,我正在构建一个调度作业控制器-这些作业将调用一个控制器和一个操作来捕获结果。我希望所有这些都发生在后端,而不涉及http调用 这有点像单元测试所发生的情况——例如: var controller = new TestController(); var result = controller.Index("TestParameter") as ViewResult; 问题是在本例中,控制器和操作不是动态的,是否有人知道如何初始化控制器并使用控制器名称和操作作为字符串参数调用操作?比如- publ

我正在构建一个调度作业控制器-这些作业将调用一个控制器和一个操作来捕获结果。我希望所有这些都发生在后端,而不涉及http调用

这有点像单元测试所发生的情况——例如:

var controller = new TestController();
var result = controller.Index("TestParameter") as ViewResult;
问题是在本例中,控制器和操作不是动态的,是否有人知道如何初始化控制器并使用控制器名称和操作作为字符串参数调用操作?比如-

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
动态执行操作:

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;
}
public ActionResult运行(string controllerName,string actionName)
{
//获取控制器
var ctrlFactory=ControllerBuilder.Current.GetControllerFactory();
var ctrl=ctrlFactory.CreateController(this.Request.RequestContext,controllerName)作为控制器;
var ctrlContext=新的ControllerContext(this.Request.RequestContext,ctrl);
var ctrlDesc=新的ReflectedControllerDescriptor(ctrl.GetType());
//采取行动
var actionDesc=ctrlDesc.FindAction(ctrlContext,actionName);
//执行
var result=actionDesc.Execute(ctrlContext,新字典
{
{“parameterName”,“TestParameter”}
})因此;
//将其他操作结果作为当前操作结果返回
返回结果;
}

请参见

我不确定您真正的问题出在哪里您想测试控制器/操作还是要测试作业的功能

  • 如果您需要测试控制器/操作,那么它将涉及
    HttpContext
  • 如果您需要测试您的作业功能,可以在服务/存储库层中以更好的方式将其分离开来,您可以使用存储库模式进行测试

  • 控制器的用途是处理浏览器请求。是否从其他类调用MVC控制器?是的,我想从其他单个控制器操作(如上面的运行操作)调用多个控制器和操作。唯一应该调用MVC控制器的是浏览器。控制器操作处理浏览器事件。如果您需要控制器在该操作期间执行某些操作,请调用另一个非控制器类。你可能应该仔细阅读MVC。哦,如果它是最简单的解决方案的话。无论如何,忽略MVC框架是如何设计的。我想说的是,从上面的代码中,我能够将计划作业功能构建到我的应用程序中,并且它已经像一个魔咒一样运行了好几个月:)我们可以随时安排任何操作按计划运行,我认为尽管MVC不是这样设计的,这是一个很好的解决方案。干杯@haim770!