المساعدين أتش تي أم أل المخصصة: إنشاء المساعد مع "باستخدام" دعم بيان

StackOverflow https://stackoverflow.com/questions/676746

  •  21-08-2019
  •  | 
  •  

سؤال

وأنا أكتب أول تطبيق MVC asp.net بلدي ولدي سؤال عن العرف المساعدين الاكواد:

لصنع نموذج، يمكنك استخدام:

<% using (Html.BeginForm()) {%>
   *stuff here*
<% } %>

وأود أن تفعل شيئا من هذا القبيل مع مساعد HTML مخصصة. وبعبارة أخرى، أريد تغيير:

Html.BeginTr();
Html.Td(day.Description);
Html.EndTr();

في:

using Html.BeginTr(){
    Html.Td(day.Description);
}

هل هذا ممكن؟

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

المحلول

وهنا هو تطبيق يمكن إعادة استخدامها المحتمل في ج #:

class DisposableHelper : IDisposable
{
    private Action end;

    // When the object is created, write "begin" function
    public DisposableHelper(Action begin, Action end)
    {
        this.end = end;
        begin();
    }

    // When the object is disposed (end of using block), write "end" function
    public void Dispose()
    {
        end();
    }
}

public static class DisposableExtensions
{
    public static IDisposable DisposableTr(this HtmlHelper htmlHelper)
    {
        return new DisposableHelper(
            () => htmlHelper.BeginTr(),
            () => htmlHelper.EndTr()
        );
    }
}

في هذه الحالة، BeginTr وEndTr الكتابة مباشرة في مجرى استجابة. إذا كنت تستخدم أساليب الإرشاد التي ترجع سلسلة، سيكون لديك لإخراج لهم باستخدام:

htmlHelper.ViewContext.HttpContext.Response.Write(s)

نصائح أخرى

وحاولت بعد النصيحة هنا في MVC3، لكنني واجهت مشكلة في استخدام:

htmlHelper.ViewContext.HttpContext.Response.Write(...);

وعندما تستخدم هذا الرمز، عوني كان يكتب في مجرى الاستجابة BEFORE صدر تخطيط بلدي. وهذا لم تعمل بشكل جيد.

وبدلا من ذلك أنا استخدم هذا:

htmlHelper.ViewContext.Writer.Write(...);

إذا نظرتم الى مصدر للMVC ASP.NET (حسب كود بلاكس )، كنت ' ليرة لبنانية نرى تنفيذ BeginForm تدعو في نهاية المطاف إلى التعليمات البرمجية التالية:

static MvcForm FormHelper(this HtmlHelper htmlHelper, string formAction, FormMethod method, IDictionary<string, object> htmlAttributes)
{
    TagBuilder builder = new TagBuilder("form");
    builder.MergeAttributes<string, object>(htmlAttributes);
    builder.MergeAttribute("action", formAction);
    builder.MergeAttribute("method", HtmlHelper.GetFormMethodString(method), true);
    htmlHelper.ViewContext.HttpContext.Response.Write(builder.ToString(TagRenderMode.StartTag));

    return new MvcForm(htmlHelper.ViewContext.HttpContext.Response);
}

والطبقة MvcForm تنفذ IDisposable، في انها طريقة التخلص من يكتب إلى الاستجابة.

وهكذا، ما كنت بحاجة إلى القيام به هو كتابة العلامات التي تريد الخروج في أسلوب مساعد وإرجاع كائن التي تطبق IDisposable ... في انها طريقة التخلص إغلاق علامة خارج.

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