سؤال

أحاول إنشاء قالب مع التحكم 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()... بناء الجملة ، ولكن ظللت وجود أخطاء في بناء الجملة.

كيف يمكن أن أفعل هذا ؟

هل كانت مفيدة؟

المحلول 2

اتضح أن 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>");
    }
}

*أعلم ، رمز الفوضى

نصائح أخرى

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

قد تريد أن تفعل شيئا مثل Html.BeginPanel() / Html.EndPanel(), مماثلة إلى كيف يتم إنشاء الأشكال مع Html.BeginForm() / Html.EndForm().بهذه الطريقة يمكنك لف الواردة المحتوى بدلا من أن تحتاج إلى تمرير كمعلمة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top