Как я могу создать шаблонный элемент управления с Asp.Net MVC? - PullRequest
1 голос
/ 30 ноября 2009

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

<% Html.PanelWithHeader()
    .HeaderTitle("My Header")
    .Content(() =>
    { %>
        <!-- ul used for no particular reason -->
        <ul>
          <li>A sample</li>
          <li>A second item</li>
        </ul>
    <% }).Render(); %>

Примечание. Да, это очень похоже на , когда Telerik создает свои MVC-элементы управления , мне нравится синтаксис.

Вот мой код PanelWithHeader:

// Extend the HtmlHelper
public static PanelWithHeaderControl PanelWithHeader(this HtmlHelper helper)
{
    return new PanelWithHeaderControl();
}

public class PanelWithHeaderControl
{
    private string headerTitle;

    private Action getContentTemplateHandler;

    public PanelWithHeaderControl HeaderTitle(string headerTitle)
    {
        this.headerTitle = headerTitle;

        return this;
    }

    public PanelWithHeaderControl Content(Action getContentTemplateHandler)
    {
        this.getContentTemplateHandler = getContentTemplateHandler;

        return this;
    }

    public void Render()
    {
        // display headerTitle as <div class="header">headerTitle</div>

        getContentTemplateHandler();
    }
}

Это отображает ul, но я не знаю, как отобразить пользовательский код в моем методе рендеринга.

Я попытался использовать HtmlHelper безуспешно. Я также попытался переопределить метод ToString, чтобы иметь возможность использовать синтаксис <%=Html.PanelWithHeader()..., но у меня все еще были ошибки синтаксиса.

Как я могу это сделать?

Ответы [ 3 ]

0 голосов
/ 30 ноября 2009
public void Render()
{
    Response.Write(getContentTemplateHandler());
}
0 голосов
/ 01 декабря 2009

Оказывается, расширения Telerik MVC являются открытыми и доступны в CodePlex , поэтому я быстро взглянул на исходный код.

Они создают HtmlTextWriter из ViewContext экземпляра HtmlHelper. Когда они пишут, он пишет на страницу.

Код становится:

// Extend the HtmlHelper
public static PanelWithHeaderControl PanelWithHeader(this HtmlHelper helper)
{
    HtmlTextWriter writer = helper.ViewContext.HttpContext.Request.Browser.CreateHtmlTextWriter(helper.ViewContext.HttpContext.Response.Output);

    return new PanelWithHeaderControl(writer);
}

public class PanelWithHeaderControl
{
    private HtmlTextWriter writer;

    private string headerTitle;

    private Action getContentTemplateHandler;

    public PanelWithHeaderControl(HtmlTextWriter writer)
    {
        this.writer = writer;
    }

    public PanelWithHeaderControl HeaderTitle(string headerTitle)
    {
        this.headerTitle = headerTitle;

        return this;
    }

    public PanelWithHeaderControl Content(Action getContentTemplateHandler)
    {
        this.getContentTemplateHandler = getContentTemplateHandler;

        return this;
    }

    public void Render()
    {
        writer.Write("<div class=\"panel-with-header\"><div class=\"header\">" + headerTitle + "</div><div class=\"content-template\">");

        getContentTemplateHandler();

        writer.Write("</div></div>");
    }
}

* Я знаю, код беспорядок

0 голосов
/ 30 ноября 2009

Возможно, вы захотите сделать что-то вроде Html.BeginPanel() / Html.EndPanel(), аналогично тому, как формы создаются с Html.BeginForm() / Html.EndForm(). Таким образом, вы можете обернуть содержимое содержимого, а не передавать его в качестве параметра.

...