C# 如何在ASP.NET MVC 3中将Razor视图呈现为字符串?

C# 如何在ASP.NET MVC 3中将Razor视图呈现为字符串?,c#,asp.net-mvc,asp.net-mvc-3,razor,C#,Asp.net Mvc,Asp.net Mvc 3,Razor,我一直在搜索这个网站,但我能找到的只是关于如何渲染部分控件.ascx,或依赖于控制器上下文的示例 我需要一种方法,该方法使我能够仅提供视图和模型的相对路径,并将具有该模型的视图渲染为字符串: string result = Utility.RenderViewToString("~/Views/My/Profile.cshtml", model); 我能找到的所有示例要么是针对旧版本的MVC,要么就是没有完成我在这里需要做的事情。您可以查看此链接 从..中提取内容 您可以使用 它不依赖于控制器

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

我需要一种方法,该方法使我能够仅提供视图和模型的相对路径,并将具有该模型的视图渲染为字符串:

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

我能找到的所有示例要么是针对旧版本的MVC,要么就是没有完成我在这里需要做的事情。

您可以查看此链接

从..中提取内容


您可以使用


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

我已经为自己创建了解决方案。它是将视图渲染为字符串的扩展

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

尽管马克的答案是正确的,并且适用于以前的版本。但现在这已经成为障碍,需要被取代

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


问题是这个示例需要一个控制器上下文,而我在尝试调用此方法时没有控制器上下文。如果我将razor模板锁定在cshtml文件中,是否有办法使其工作?。我知道聚会有点晚了。不用担心-我还在:)当然,只需通过
File.ReadAllText(path)加载内容即可编码到变量中。是否可以将对象(模型)传递到视图@Marc@Kennyomar他正在将一个模型传递到第二行的视图中。razorengine项目变化太大了,现在很难使用它,我建议使用RazorHosting
string template = "Hello @Model.Name! Welcome to Razor!";
string result = Razor.Parse(template, new { Name = "World" });
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);
    }
}
[HttpPost]
public ActionResult GetTreeUnit(string id)
{
    int _id = id.ExtractID();
    string render = ControllerContext.RenderPartialToString("SomeView");
    return Json(new { data = render });
}
string template = "Hello @Model.Name! Welcome to Razor!";
string Result = Engine.Razor.RunCompile(template, "templateKey", null, new { Name = "World" });