Как работает Html Helper, RenderPartial? Как я могу реализовать помощника, который может вводить контент из частичного представления?

Когда вы используете 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();
    }
}

Кто-нибудь знает, как это сделать?


person Matt    schedule 15.08.2009    source источник


Ответы (3)


Расширения 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().

person womp    schedule 15.08.2009

Мы исправляем это в MVC 2. Вы сможете вызвать Html.Partial() и получить фактическое содержимое представления в виде строки.

person Brad Wilson    schedule 16.08.2009

Почему бы не создать второе представление и не иметь внутри него частичное, передать имя как ViewData или в модели и т. д.

Что-то вроде:

<div id='<%= ViewData["Name"] + "_Window"%>' class='window'>
   <% Html.RenderPartial(ViewData["Name"]); %>
</div>

Надеюсь, это поможет, Дэн

person Daniel Elliott    schedule 15.08.2009