سؤال

أنا أكتب RenderContents() طريقة التحكم في خادم ASP.NET الخاص بي.تستخدم الطريقة HtmlTextWriter كائن لتقديم محتوى الإخراج.للتحكم الذي أكتبه، باستخدام HtmlTextWriterيبدو أن الأساليب التي تستخدمها ستتطلب الكثير من أسطر التعليمات البرمجية لفتح وإغلاق كل علامة وإضافة كل سمة إلى الدفق.في النهاية أشعر أنني سأنتهي برمز أطول بكثير مما ينبغي.

كنت أفكر أنه إذا استخدمت فئة قابلة للتسلسل مثل StringBuilder, ، سيكون الكود الخاص بي أكثر وضوحًا في القراءة وأسهل في الكتابة.

ما كنت أتساءل عنه هو، هل هناك أي سبب لاستخدام HtmlTextWriter هل ترغب في عرض محتويات عنصر التحكم بالكامل؟بخلاف فحوصات السلامة (على ما أفترض) فهي تتضمن التأكد من عدم كتابة العلامات بترتيب خاطئ أو إنشاء علامات غير صالحة، لا أرى سببًا.

يبدو أنه سيكون من الأسهل القيام بشيء مثل هذا:

protected override void RenderContents(HtmlTextWriter output)
{
    StringBuilder s = new StringBuilder();
    s.Append("lots")
     .Append("of")
     .Append("strings");

    output.BeginRender();
    output.Write(s.ToString());
    output.EndRender();
}

هل هناك أي سبب يجعل هذه فكرة سيئة؟

تحديث
للإستجابة ل مهرداد افشاريإجابة:
لم أفكر كثيرًا في متطلبات الذاكرة الخاصة بوجود جهاز منفصل StringBuilder تم إنشاء مثيل للكائن.ماذا عن إنشاء غلاف لـ HtmlTextWriter بحيث يمكن ربطه بالسلاسل بحيث لا يتم إنشاء سلسلة إضافية.

public class ChainedHtmlTextWriter
{
    private HtmlTextWriter _W;
    public ChainedHtmlTextWriter(HtmlTextWriter writer)
    {
        _W = writer;
    }

    public ChainedHtmlTextWriter Write<T>(T value) 
    { 
        _W.Write(value); 
        return this; 
    }

    public ChainedHtmlTextWriter WriteLine<T>(T value)
    {
        _W.WriteLine(value);
        return this;
    }
}
هل كانت مفيدة؟

المحلول

أنا أعمل على تطبيق اتبع فيه المطورون المسار الرهيب الذي تستكشفه.يعود هذا إلى الأيام التي كان عليك فيها كتابة ملفات ISAPI dlls الخاصة بك والتي تبث كود html.إنه صداع مستمر للعمل فيه.إذا كان الكود الخاص بك عبارة عن سلاسل في الغالب، فهذا يعني أن هناك خطأ ما.

معظم التعليمات البرمجية من هذا النوع التي أقوم بتغييرها أقوم بإنشاء مثيل لكائنات الخادم، وتكوين خصائصها حسب الرغبة، ثم أخبرها بـ .RenderControl(writer).وهذا يجعل قراءة الكود والعمل معه أسهل بكثير.إذا كان هناك أداء مرتفع من النفقات العامة التي يجلبها هذا، فأنا على استعداد لقبوله (في الواقع، يعمل التطبيق عمومًا بشكل أسرع بعد إجراء التغييرات، لذا وفقًا للروايات، ليس هذا هو الحال، لكنني لم أقم بتوصيفه رمز بلدي).

أحد العوائق البسيطة لتشفير الأشياء الخاصة بك في سلاسل هو عندما تتغير معايير HTML.تمت كتابة الكود الذي أعمل عليه في 04/05، ومنذ ذلك الحين أصبح <BR> <br /> ولم تعد علامات html الكبيرة صالحة للشريعة اليهودية بعد الآن، وما إلى ذلك.إذا كانوا يستخدمون عناصر تحكم الخادم، فإن عناصر تحكم الخادم هذه قد غيرت HTML الناتج دون الحاجة إلى القيام بأي شيء.وهذا مجرد مثال بسيط.

يحرر:أوه، وراجع للشغل، BeginRender وEndRender ليس لديهما أي تطبيق.إنها عناصر نائبة يمكنك تجاوزها وتوفير وظائف مخصصة في فئة مشتقة من HtmlTextWriter.

تحرير 2:في بعض الأحيان يكون الأمر مرهقًا بعض الشيء دائماً استخدم عناصر تحكم الخادم، مثل الحاويات والأشياء.سأفعل الكثير من .Controls.Add() ثم أعرض الحاوية لاحقًا.لذلك أحيانًا أفعل هذا:

writer.AddAttribute(HtmlTextWriterAttribute.Class, "myContainerClass");
writer.RenderBeginTag(HtmlTextWriterTag.Div);
// do some stuff, .RenderControl on some other controls, etc.
writer.RenderEndTag();

كما ذكرنا سابقًا، سيؤدي هذا إلى عرض html الصحيح حتى إذا تغير html الخاص بـ div في المستقبل، لأنه ليس لدي أي سلاسل مشفرة.

نصائح أخرى

من ناحية الأداء، سيتطلب هذا إجراء المزيد من نسخ السلسلة. HtmlTextWriter يكتب مباشرة إلى المخزن المؤقت للإخراج. StringBuilder من ناحية أخرى، لديها المخزن المؤقت الخاص بها.عندما تتصل ToString على ال StringBuilder, ، يجب إنشاء سلسلة جديدة ثم سيتم كتابتها في المخزن المؤقت للإخراج بواسطة output.Write.يتطلب الأمر المزيد من العمل الذي يتعين القيام به.

لا أعتقد أنه ينبغي عليك الاتصال بـ BeginRender/EndRender، حيث يتم ذلك عن طريق الصفحة.

لا أستطيع أن أرى كيف سيؤدي استخدام منشئ السلسلة إلى حفظ أي عمل عبر استخدام أساليب HtmlTextWriters الخاصة.

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