Как работает HTML-помощник RenderPartial?Как я могу реализовать помощника, который может получать контент из частичного представления?
-
16-09-2019 - |
Вопрос
Когда вы используете Html.RenderPartial, он принимает имя представления, которое вы хотите отобразить, и отображает его содержимое в этом месте.
Я хотел бы реализовать что-то подобное.Я бы хотел, чтобы оно взяло имя представления, которое вы хотите отобразить, а также некоторые другие переменные и отобразило содержимое внутри контейнера.
Например:
public static class WindowHelper
{
public static string Window(this HtmlHelper helper, string name, string viewName)
{
var sb = new StringBuilder();
sb.Append("<div id='" + name + "_Window' class='window'>");
//Add the contents of the partial view to the string builder.
sb.Append("</div>");
return sb.ToString();
}
}
Кто-нибудь знает, как это сделать?
Решение
Расширения RenderPartial запрограммированы для рендеринга непосредственно в объект Response...вы можете увидеть это в исходном коде для них:
....).Render(viewContext, this.ViewContext.HttpContext.Response.Output);
Это означает, что если вы немного измените свой подход, вы, вероятно, сможете добиться того, чего хотите.Вместо того, чтобы добавлять все в StringBuilder, вы могли бы сделать что-то вроде этого:
using System.Web.Mvc.Html;
public static class WindowHelper
{
public static void Window(this HtmlHelper helper, string name, string viewName)
{
var response = helper.ViewContext.HttpContext.Response;
response.Write("<div id='" + name + "_Window' class='window'>");
//Add the contents of the partial view to the string builder.
helper.RenderPartial(viewName);
response.Write("</div>");
}
}
Обратите внимание, что включение System.Web.Mvc.Html позволяет получить доступ к методам RenderPartial().
Другие советы
Мы исправляем это в MVC 2.Вы сможете вызвать Html.Partial() и получить фактическое содержимое представления в виде строки.
Почему бы не создать второе представление и не разместить внутри него частичную часть, передать имя как ViewData или в модели и т. д.
Что-то вроде:
<div id='<%= ViewData["Name"] + "_Window"%>' class='window'>
<% Html.RenderPartial(ViewData["Name"]); %>
</div>
Надеюсь, это поможет, Дэн