Asp.net mvc 从另一个控制器调用控制器时未使用MVC EditorFor模板

Asp.net mvc 从另一个控制器调用控制器时未使用MVC EditorFor模板,asp.net-mvc,model-view-controller,editorfor,editorfortemplate,Asp.net Mvc,Model View Controller,Editorfor,Editorfortemplate,在MVC项目中,我们有一个区域,其中有一个控制器SomeController返回一个包含EditorFor语句的部分视图,每个语句都有自己的模板 如果通过该区域的路由直接调用控制器,则一切正常。但是,如果通过区域外的另一个控制器调用,即通过“new SomeController().SomeAction()”,则即使显式指定,也不会使用模板(视图返回ok,但仅显示默认文本框等) 这可能是什么原因以及如何修复?当仅使用ctrl.action()调用操作时,将使用当前的RoutedData(其中包含

在MVC项目中,我们有一个区域,其中有一个控制器SomeController返回一个包含EditorFor语句的部分视图,每个语句都有自己的模板

如果通过该区域的路由直接调用控制器,则一切正常。但是,如果通过区域外的另一个控制器调用,即通过“new SomeController().SomeAction()”,则即使显式指定,也不会使用模板(视图返回ok,但仅显示默认文本框等)


这可能是什么原因以及如何修复?

当仅使用
ctrl.action()
调用操作时,将使用当前的
RoutedData
(其中包含当前的
区域/控制器/action
值)当Razor试图解析
编辑器或模板
路径时,它会参考仍然包含原始操作(现在错误)值的
视图上下文

您最好使用
ControllerFactory
来模拟所需的行为:

var ctrlFactory = ControllerBuilder.Current.GetControllerFactory();

var routeData = new RouteData();
routeData.DataTokens.Add("area", "target_area_name");
routeData.Values.Add("controller", "target_controller_name");
routeData.Values.Add("action", "target_action_name");

var requestContext = new RequestContext(this.HttpContext, routeData);
var ctrl = ctrlFactory.CreateController(requestContext, "target_controller_name") as TargetControllerType;

if (ctrl != null)
{
    ctrl.ControllerContext = new ControllerContext(requestContext, ctrl);

    var ctrlDesc = new ReflectedControllerDescriptor(typeof(TargetControllerType));
    var actionDesc = ctrlDesc.FindAction(ctrl.ControllerContext, "target_action_name");

    var result = actionDesc.Execute(ctrl.ControllerContext, new Dictionary<string, object>()) as ActionResult;

    this.RouteData.DataTokens["area"] = "target_area_name";
    this.RouteData.Values["controller"] = "target_controller_name";
    this.RouteData.Values["action"] = "target_action_name";

    return result;
}
var-ctrlFactory=ControllerBuilder.Current.GetControllerFactory();
var routeData=新routeData();
routeData.DataTokens.Add(“区域”、“目标区域名称”);
添加(“控制器”、“目标控制器名称”);
routeData.Values.Add(“action”、“target_action_name”);
var requestContext=newrequestcontext(this.HttpContext,routeData);
var ctrl=ctrlFactory.CreateController(requestContext,“target\u controller\u name”)作为TargetControllerType;
如果(ctrl!=null)
{
ctrl.ControllerContext=新的ControllerContext(requestContext,ctrl);
var ctrlDesc=新的反射控制器描述器(typeof(TargetControllerType));
var actionDesc=ctrlDesc.FindAction(ctrl.ControllerContext,“target\u action\u name”);
var result=actionDesc.Execute(ctrl.ControllerContext,new Dictionary())作为ActionResult;
this.RouteData.DataTokens[“area”]=“target\u area\u name”;
this.RouteData.Values[“controller”]=“target\u controller\u name”;
this.RouteData.Values[“action”]=“target\u action\u name”;
返回结果;
}

请参见

模板的位置(在
/Views/Shared/EditorTemplates
中)?在
新建SomeController()之后,您是否确实初始化了控制器?它需要
ControllerContext
才能工作correctly@StephenMuecke:它们位于区域//视图/Some/EditorTemplates中,如果调用控制器,则发现它们正常directly@haim770你到底是什么意思?该区域中的控制器是使用“new SomeController().SomeAction()”调用的,我是否应该传递其他内容?如果您将它们放在
/Views/Shared/EditorTemplates
文件夹中,所有控制器都应该可以找到它们。我对这个片段印象深刻,它也可以工作,但遗憾的是结果是相同的(模板被忽略)@devlock,您是否为
区域
控制器
操作
填写了正确的值?我相信是的,控制器操作的执行没有问题,只是模板没有问题rendered@devlock,我已经更新了答案。它现在不那么优雅了,但应该能用。