我有一个错误,过去几天一直在我身边。我有一些代码,它采用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的更多信息。那里可能有一些功能正在替换或破坏我的控制器的默认构造函数。
答案 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
我会尝试这一点并希望它能为我们解决问题。