如何在ASP.NET MVC 3中将Razor View渲染为字符串?

bev*_*qua 27 c# asp.net-mvc razor asp.net-mvc-3

我一直在搜索网站,但我能找到的只是如何渲染部分控件.ascx或依赖于控制器上下文的示例.

我想要一个方法,使我能够提供视图的相对路径和模型,并将该模型的视图呈现为字符串:

string result = Utility.RenderViewToString("~/Views/My/Profile.cshtml", model);
Run Code Online (Sandbox Code Playgroud)

我能找到的所有例子都是旧版本的MVC,或者根本就没有做我需要做的事情.

Mar*_*arc 27

你可以用razorengine实现这一目标.

string template = "Hello @Model.Name! Welcome to Razor!";
string result = Razor.Parse(template, new { Name = "World" });
Run Code Online (Sandbox Code Playgroud)

并且它不依赖于控制器上下文 - 但由于这一点,您无法使用Html帮助程序(依赖于http上下文).但是使用razor作为字符串的模板引擎是完美的.

  • 如果我将剃刀模板锁定在 cshtml 文件中,有没有办法使这项工作?我知道聚会有点晚了。 (2认同)
  • 不用担心 - 我还在附近:)当然,只需通过`File.ReadAllText(path);`将内容加载到变量中. (2认同)

Rav*_*dag 12

你可以查看这个链接.

Render Razor视图中提取内容 到String..

public static string RenderRazorViewToString(string viewName, object model)
{
    ViewData.Model = model;
    using (var sw = new StringWriter())
    {
        var viewResult = ViewEngines.Engines.FindPartialView(ControllerContext, viewName);
        var viewContext = new ViewContext(ControllerContext, viewResult.View, ViewData, TempData, sw);
        viewResult.View.Render(viewContext, sw);
        return sw.GetStringBuilder().ToString();
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 问题是该示例需要一个控制器上下文,我没有从我试图调用此方法的位置. (12认同)

Ole*_*syk 10

我为我创造了解决方案.它是将视图呈现为字符串的扩展.

public static class RenderPartialToStringExtensions
{
    /// <summary>
    /// render PartialView and return string
    /// </summary>
    /// <param name="context"></param>
    /// <param name="partialViewName"></param>
    /// <param name="model"></param>
    /// <returns></returns>
    public static string RenderPartialToString(this ControllerContext context, string partialViewName, object model)
    {
        return RenderPartialToStringMethod(context, partialViewName, model);
    }

    /// <summary>
    /// render PartialView and return string
    /// </summary>
    /// <param name="context"></param>
    /// <param name="partialViewName"></param>
    /// <param name="viewData"></param>
    /// <param name="tempData"></param>
    /// <returns></returns>
    public static string RenderPartialToString(ControllerContext context, string partialViewName, ViewDataDictionary viewData, TempDataDictionary tempData)
    {
        return RenderPartialToStringMethod(context, partialViewName, viewData, tempData);
    }

    public static string RenderPartialToStringMethod(ControllerContext context, string partialViewName, ViewDataDictionary viewData, TempDataDictionary tempData)
    {
        ViewEngineResult result = ViewEngines.Engines.FindPartialView(context, partialViewName);

        if (result.View != null)
        {
            StringBuilder sb = new StringBuilder();
            using (StringWriter sw = new StringWriter(sb))
            {
                using (HtmlTextWriter output = new HtmlTextWriter(sw))
                {
                    ViewContext viewContext = new ViewContext(context, result.View, viewData, tempData, output);
                    result.View.Render(viewContext, output);
                }
            }

            return sb.ToString();
        }
        return String.Empty;
    }

    public static string RenderPartialToStringMethod(ControllerContext context, string partialViewName, object model)
    {
        ViewDataDictionary viewData = new ViewDataDictionary(model);
        TempDataDictionary tempData = new TempDataDictionary();
        return RenderPartialToStringMethod(context, partialViewName, viewData, tempData);
    }
}
Run Code Online (Sandbox Code Playgroud)

而且我们可以在Action中呈现视图

[HttpPost]
public ActionResult GetTreeUnit(string id)
{
    int _id = id.ExtractID();
    string render = ControllerContext.RenderPartialToString("SomeView");
    return Json(new { data = render });
}
Run Code Online (Sandbox Code Playgroud)


Roh*_*ora 5

虽然Marc的答案是正确的,适用于以前的版本.但现在已经过时了,需要更换.

以下是适用于我的新代码,您可以在Github上找到更多有用的信息:Razor Engine

string template = "Hello @Model.Name! Welcome to Razor!";
string Result = Engine.Razor.RunCompile(template, "templateKey", null, new { Name = "World" });
Run Code Online (Sandbox Code Playgroud)