Как сделать Razor View для строки в ASP.NET MVC 3? - PullRequest
27 голосов
/ 11 февраля 2012

Я много искал сайт, но все, что я мог найти, это примеры того, как визуализировать частичные элементы управления .ascx, или зависел от контекста контроллера.

Я хочу метод, который позволяет мнечтобы указать только относительный путь к представлению и модели, и отобразить это представление с этой моделью в строку:

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

Все примеры, которые я смог найти, были либо для более старых версий MVC, либо простоне сделал то, что мне нужно сделать здесь.

Ответы [ 4 ]

27 голосов
/ 12 марта 2012

Этого можно добиться с помощью разоренга .

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

И это не зависит от контекста контроллера - но из-за этого вы не можете использовать Html-помощники (которые полагаются на http-контекст). Но идеально использовать бритву как шаблонизатор для строк.

12 голосов
/ 11 февраля 2012

Вы можете проверить эту ссылку.

извлеченное содержимое из Отображение Razor в строку .,

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();
    }
}
10 голосов
/ 22 февраля 2013

Я создал решение для меня. Это расширение, которое отображает вид в строку.

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 });
}
4 голосов
/ 30 ноября 2016

Хотя ответ Марка правильный и работает для предыдущих версий.Но теперь он устарел и требует замены.

Вот новый код, который работал для меня, и вы можете найти более полезную информацию о Github: Razor Engine

string template = "Hello @Model.Name! Welcome to Razor!";
string Result = Engine.Razor.RunCompile(template, "templateKey", null, new { Name = "World" });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...