【问题标题】:How to render a Razor View to a string in ASP.NET MVC 3?如何在 ASP.NET MVC 3 中将 Razor 视图呈现为字符串?
【发布时间】:2012-03-03 20:18:36
【问题描述】:

我一直在搜索该站点,但我只能找到有关如何呈现部分控件 .ascx 或取决于控制器上下文的示例。

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

string result = Utility.RenderViewToString("~/Views/My/Profile.cshtml", model);

我能找到的所有示例都是针对旧版本的 MVC,或者根本没有做我需要在这里做的事情。

【问题讨论】:

    标签: c# asp.net-mvc asp.net-mvc-3 razor


    【解决方案1】:

    您可以使用razorengine 来实现。

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

    而且它不依赖于控制器上下文——但正因为如此,您无法使用 Html 助手(依赖于 http 上下文)。但是使用 razor 作为字符串的模板引擎是完美的。

    【讨论】:

    • 如果我将剃须刀模板锁定在 cshtml 文件中,是否有办法使这项工作?我知道聚会有点晚了。
    • 不用担心 - 我还在 :) 当然,只需通过 File.ReadAllText(path); 将内容加载到变量中。
    • 你能将对象(模型)传递给视图吗? @马克
    • @Kennyomar 他正在将模型传递到第二行的视图中。
    • 项目razorengine变化太大了,现在真的很难用了,推荐使用RazorHostinggithub.com/RickStrahl/Westwind.RazorHosting
    【解决方案2】:

    您可以查看此链接。

    Render Razor view to 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();
        }
    }
    

    【讨论】:

    • 问题是该示例需要一个控制器上下文,而我在尝试调用此方法时没有该上下文。
    【解决方案3】:

    我已经为我创建了解决方案。将视图呈现为字符串的扩展。

    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);
        }
    }
    

    我们可以在 Action 中渲染视图

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

    【讨论】:

      【解决方案4】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2015-08-02
        • 2016-10-10
        • 2011-01-28
        • 1970-01-01
        • 2013-09-28
        相关资源
        最近更新 更多