문제

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 컨트롤을 만드는 방법, 나는 구문을 좋아합니다.

다음은 내 패널 위의 헤드 코드입니다.

// 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()... 구문이지만 구문 오류가 계속되었습니다.

어떻게 할 수 있습니까?

도움이 되었습니까?

해결책 2

그것은 그게 밝혀졌습니다 Telerik MVC Extensions는 오픈 소스이며 CodePlex에서 사용할 수 있습니다 그래서 소스 코드를 간단히 살펴 보았습니다.

그들은 htmlhelper 인스턴스의 ViewContext에서 htmltextWriter를 만듭니다. 그들이 그것을 쓸 때, 그것은 페이지에 씁니다.

코드는 다음과 같습니다.

// 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>");
    }
}

*코드는 엉망입니다

다른 팁

public void Render()
{
    Response.Write(getContentTemplateHandler());
}

당신은 같은 일을하고 싶을 수도 있습니다 Html.BeginPanel() / Html.EndPanel(), 형태가 어떻게 만들어 지는지와 유사합니다 Html.BeginForm() / Html.EndForm(). 이렇게하면 포함 된 컨텐츠를 매개 변수로 전달하는 대신 포함 된 컨텐츠를 랩핑 할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top