当ASP.Net MVC部分视图包含渲染操作时,将该部分视图渲染为字符串

本文关键字:视图 该部 字符串 操作 Net ASP 包含渲 MVC | 更新日期: 2023-09-27 18:20:24

我有一个错误,过去几天一直在运行。我有一些代码,它采用HttpContext和ViewResult,并将视图呈现到字符串中。这段代码似乎运行得很好,直到我引入了一个包含@Html.RenderAction调用的视图。当RenderAction调用被添加到视图中时,我收到一条错误消息,指出绑定到该操作的控制器需要一个无参数构造函数。然而,添加这样一个构造函数并不能改善这种情况。执行渲染的代码如下:

public static string Render(HttpContextBase httpContext, ViewResultBase partialViewResult)
{
    var routeData = new RouteData();
    routeData.Values.Add("controller", "mock");
    var context = new ControllerContext(httpContext, routeData, new EmptyController());
    var view = partialViewResult.View;
    if (view == null)
    {
        result = partialViewResult.ViewEngineCollection.FindPartialView(context, partialViewResult.ViewName);
        view = result.View;
    }
    using (var sw = new StringWriter())
    {
        var viewContext = new ViewContext(context, view, partialViewResult.ViewData,
                                      partialViewResult.TempData, sw);
        view.Render(viewContext, sw);
        if (result != null)
            result.ViewEngine.ReleaseView(context, view);
        return sw.ToString();
    }
}

在我试图渲染的视图中,我尝试过:

@{ Html.RenderAction(FormController.Directive(Model.FormModel)); }

@Html.Action(FormController.Directive(Model.FormModel))

两者都会导致相同的错误消息。

An error occurred when trying to create a controller of type 'FormController'. Make sure that the controller has a parameterless public constructor.

完全删除操作调用可以消除错误消息。

控制器中的动作看起来像:

public virtual ActionResult Directive(FormModel model)
{
    model.MyProperty = "test";
    return View("FormView", model);
}

如有任何建议,我们将不胜感激。

更新

我把这个问题归结为与Unity有某种联系。当我添加一个空构造函数并删除所有其他构造函数时,呈现代码就会工作。其他构造函数包括对通过Unity路由的接口的引用。我需要了解更多关于团结的信息。那里可能有一些功能正在替换或破坏我的控制器的默认构造函数。

当ASP.Net MVC部分视图包含渲染操作时,将该部分视图渲染为字符串

Html.Action声明应该如下所示:

@Html.Action("Directive", "Form", new { model = Model.FormModel })

/将默认构造函数添加到"FormModel"类中,它将解决问题/

public void FormModel()
    {
    }

如前所述,该错误与我们使用Unity IOC有关。当使用依赖注入的控制器时,这似乎是MVC的一个已知问题。CodeProject上有一个拟议的修复程序:http://www.codeproject.com/Articles/99361/How-To-Use-Unity-Container-In-ASP-NET-MVC-Framewor

我会尝试一下,希望它能为我们纠正问题。