当局部视图包含渲染操作

时间:2015-11-04 01:02:45

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

我有一个错误,过去几天一直在我身边。我有一些代码,它采用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路由的接口的引用。我需要了解有关Unity的更多信息。那里可能有一些功能正在替换或破坏我的控制器的默认构造函数。

3 个答案:

答案 0 :(得分:0)

Html.Action声明应如下所示:

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

答案 1 :(得分:0)

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

public void FormModel()
    {

    }

答案 2 :(得分:0)

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

我会尝试这一点并希望它能为我们解决问题。

相关问题