ASP.NET MVC Razor:如何在控制器动作中呈现Razor Partial View的HTML

Pet*_*nar 97 c# asp.net-mvc razor

如何在ASP.NET视图引擎上生成给定局部视图的HTML 是已知的.

但是如果在razor局部视图上使用此功能则它不起作用,因为异常说部分视图不是从"UserControl"派生的.

如何修复渲染以支持剃刀局部视图?

我需要这个,因为我从这个部分视图生成电子邮件...

更新:

失败的代码(@mcl):

public string RenderPartialToString(string controlName, object viewData)
    {
        ViewPage viewPage = new ViewPage() { ViewContext = new ViewContext() };
        viewPage.Url = this.GetUrlHelper();

        string fullControlName = "~/Views/Email/" + controlName + ".ascx";

        viewPage.ViewData = new ViewDataDictionary(viewData);
        viewPage.Controls.Add(viewPage.LoadControl(fullControlName));

        StringBuilder sb = new StringBuilder();
        using (StringWriter sw = new StringWriter(sb))
        {
            using (HtmlTextWriter tw = new HtmlTextWriter(sw))
            {
                viewPage.RenderControl(tw);
            }
        }
        return sb.ToString();
    }
Run Code Online (Sandbox Code Playgroud)

jga*_*fin 153

@Html.Partial("nameOfPartial", Model)
Run Code Online (Sandbox Code Playgroud)

更新

protected string RenderPartialViewToString(string viewName, object model)
{
    if (string.IsNullOrEmpty(viewName))
        viewName = ControllerContext.RouteData.GetRequiredString("action");

    ViewData.Model = model;

    using (StringWriter sw = new StringWriter()) {
        ViewEngineResult viewResult = ViewEngines.Engines.FindPartialView(ControllerContext, viewName);
        ViewContext viewContext = new ViewContext(ControllerContext, viewResult.View, ViewData, TempData, sw);
        viewResult.View.Render(viewContext, sw);

        return sw.GetStringBuilder().ToString();
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 一个subquestiuon:如何呈现另一个Controller范围中的视图然后是当前的?可以说它在"EmailController"范围内(电子邮件视图文件夹)? (2认同)
  • @AmeyKhadatkar:不.jquery是客户端,视图在发送到浏览器之前在服务器端生成. (2认同)

Sco*_*rry 8

虽然已经给出了足够的答案,但我想提出一个不那么详细的解决方案,可以在没有MVC控制器类中可用的辅助方法的情况下使用.使用名为"RazorEngine"的第三方库,您可以使用.Net文件IO来获取剃刀文件的内容并调用

string html = Razor.Parse(razorViewContentString, modelObject);
Run Code Online (Sandbox Code Playgroud)

这里获取第三方库.


Omu*_*Omu 5

你也可以使用RenderView Controller extensionfrom here (来源)

并像这样使用它:

public ActionResult Do() {
var html = this.RenderView("index", theModel);
...
}
Run Code Online (Sandbox Code Playgroud)

它适用于剃须刀网络表单视图引擎