Как визуализировать Razor View для строки в ASP.NET MVC 3?
Я много искал сайт, но все, что я мог найти, было примером того, как отображать частичные элементы управления .ascx
или зависит от контекста контроллера.
Мне нужен метод, который позволяет мне предоставлять только относительный путь к представлению и модели и отображать это представление с этой моделью в строку:
string result = Utility.RenderViewToString("~/Views/My/Profile.cshtml", model);
Все примеры, которые я мог найти, были либо для более старых версий MVC, либо просто не сделали того, что мне нужно сделать здесь.
Ответы
Ответ 1
Вы можете достичь этого с помощью razorengine.
string template = "Hello @Model.Name! Welcome to Razor!";
string result = Razor.Parse(template, new { Name = "World" });
И это не зависит от контекста контроллера, но из-за этого вы не можете использовать Html-помощники (которые полагаются на контекст http). Но идеально подходит для использования бритвы в качестве механизма шаблонов для строк.
Ответ 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
Хотя Марк отвечает правильно и работает для предыдущих версий. Но это теперь невозможно и нужно заменить.
Вот новый код, который работал у меня, и вы можете найти более полезную информацию о Github: Razor Engine
string template = "Hello @Model.Name! Welcome to Razor!";
string Result = Engine.Razor.RunCompile(template, "templateKey", null, new { Name = "World" });