[英]Render an ASP.Net MVC partial view to a string when the partial view contains a render action
在過去的幾天里,我遇到了一個錯誤,一直困擾着我。 我有一些代碼需要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的更多信息。 那里可能有一些功能正在替換或破壞控制器的默認構造函數。
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
我會嘗試一下,希望它可以為我們解決問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.