قم بإزالة ctl00$ContentBody$ من معرف التحكم المعروض

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

  •  06-07-2019
  •  | 
  •  

سؤال

لقد قمت بإجراء بعض التغييرات على تطبيق موجود كان في السابق مجرد HTML وJavascript.لإضافة وظيفة من جانب الخادم، اخترت ASP.NET، واستفدت من مفهوم الصفحة الرئيسية.لسوء الحظ، في أحد نماذج الويب الضخمة، تتشوه معرفات التحكم جميعها بالبادئة "ctl00$ContentBody$".لقد قمت بمعالجة runat = "server" على جميع عناصر التحكم في INPUT وهو ما غير المعرفات.الآن بعد أن تم تغيير المعرفات، أصبح جافا سكريبت (الذي تمت كتابته بشكل سيء جدًا لدرجة أنني لا أستطيع حتى قراءته، ولدي خبرة كبيرة في التعامل مع JS) معطلًا تمامًا.

لذا، كيف يمكنني منع ظهور هذا الهراء في HTML؟كنت آمل أن أتمكن بطريقة ما من إنشاء فئة ترث HtmlGenericControl (أنا لا أستخدم عناصر تحكم الويب، لقد قمت للتو بإدخال runat = "server" لكل علامة إدخال) وتجاوز بطريقة ما المنطق الذي يربط "معرف الحاوية" هذا في بداية سمات المعرف والاسم.ثم يمكنني استخدام tagMapping في web.config لإجراء التغيير العالمي.هل هذا ممكن؟

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

المحلول 6

كان

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

Protected Overrides Sub Render(ByVal writer As System.Web.UI.HtmlTextWriter)
    Dim Html As New StringWriter()
    Dim Render As New HtmlTextWriter(Html)
    MyBase.Render(Render)
    writer.Write(Html.ToString().Replace("name=""ctl00$ContentBody$", "name=""").Replace("id=""ctl00_ContentBody_", "id="""))
End Sub

نصائح أخرى

عزاء صغير للالآن، ولكن هذه "الميزة" سوف تكون ثابتة في Asp.Net 4.0. سوف تحصل الملكية ClientID القابل للتعيين.

وبخلاف ذلك، فإن الردود أخرى جيدة.
استخدام <٪ = control.ClientID٪>

وأو رمي في مسج واستخدام $ ( "[معرف $ = 'myId'])

وأو على بطاقات الإدخال، لا تضع وقت = 'الملقم'. يجب أن تكون قادرا على استرداد القيم عبر عضو نموذج (مثلما هو الحال في آسيا والمحيط الهادئ التقليدية)

وأو تخطي لدت WebForms Asp.Net وانتقل إلى Asp.Net MVC، والتي تعطيك السيطرة الكاملة على ترميز HTML التي يتم إنشاؤها. لديك لتغيير الطريقة التي يتم القيام بأشياء أكثر قليلا، ولكن هذا قد يكون أقل محبطا بالنسبة لك.

وحاولت هذه القطعة من رمز ولسبب ما reorganises صفحة كاملة:

Protected Overrides Sub Render(ByVal writer As System.Web.UI.HtmlTextWriter)
    Dim Html As New StringWriter()
    Dim Render As New HtmlTextWriter(Html)
    MyBase.Render(Render)
    writer.Write(Html.ToString().Replace("name=""ctl00$ContentBody$", "name=""").Replace("id=""ctl00_ContentBody_", "id="""))
End Sub

إذا كنت ترغب في رؤية المثال سوء تقديم URL

وأنا لا أعرف أي طريقة لإزالة الحاوية تسمية من يجري إرفاق مسبقا إلى معرف السيطرة. في الماضي كنت قد استخدمت طريقة ملائمة للبحث عن مثل هذه المعرفات في جافا سكريبت أن بالتكرار من خلال أسماء العلامات ويستخدم تعبير عادي لمباراة واحدة أن ينتهي $realID، حيث realID هو معرف التي اعطيت للتحكم في علامة فوق. الآن، وأود أن استخدام مسج لهذا باستخدام محدد مثل:

 $('[id$="realID"]')

والتي لا أساسا نفس الشيء لي طريقة الراحة القديمة، ولكن انها بنيت في الإطار.

على حد علمي لا توجد طريقة لإزالتها لنفس السبب الذي قلته؛للتأكد من أنها فريدة من نوعها.من وجهة نظري أمامك خياران:

  1. قم بإنشاء متغير JS وألحقه بجميع استدعاءات JS الخاصة بك حتى يبحث عن المعرف الصحيح
  2. استخدم <%= control.ClientID %> في جافا سكريبت الخاص بك حتى يستخدم المعرف الجديد.

مع رقم 1، إذا كان أي من مدخلاتك ضمن أي علامة خادم أخرى، فلن يعمل.هذا عرضة للعديد من المشاكل لذا سأختار رقم 2 إذا استطعت.

2 يعتمد إما على وجود جافا سكريبت على الصفحة نفسها أو إذا كان JS خارجيًا، فيجب أن تكون قادرًا على تمرير المعرفات.لم يتم اختبار هذا الرمز وهو مجرد مثال ولكن هنا ما أعنيه:

function alertValue(textID){
     alert(document.GetElementById(textID).value);
}

<input id="txtBox" runat="server" type="Button" text="Click Me" onClick="alertValue('<%= txtBox.ClientID %>');" />

يعتمد الأمر حقًا على كيفية تنفيذ JS الخاص بك.

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

إعادة كتابة ASP.NET إخراج الصفحة

وبعد أن تحصل على النص الذي نعمل معك يمكن على الأرجح الكتابة شيء من هذا القبيل ...

output = Regex.Replace(
    output, 
    @"id\=""ctl00\$[^\""]*""", 
    string.Empty, 
    RegexOptions.IgnoreCase
    );

وبعد ذلك كتابة الإخراج النهائي للHtmlTextWriter.

وعلى أمل أن يساعد.

والتحقق من ذلك: http://clientidless.codeplex.com/ - يمكنك إيقاف ClientID إلى ما يقرب من أي سيطرة. هنا هو تجريبي: http://show-demos.net/NoClientId/ - اضغط على "تقديم دون معرفات "أو" جعل مع معرفات "لنرى كيف يتغير حجم الصفحة. عرض المصدر لمعرفة الفرق.

وأود أن أضيف بلدي اثنين سنتا إلى هذا واحد:

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

public class CleanHtmlTextWriter : HtmlTextWriter
{
    private const string MASTER_PAGE_ID = "ctl00";
    private const string CONTENT_NAME = "MainContent";

    public CleanHtmlTextWriter(TextWriter writer)
        : base(writer)
    {
    }

    public override void WriteAttribute(string name, string value)
    {
        if (name == "name")
            value = value.Replace(CONTENT_NAME + "$", "").Replace(MASTER_PAGE_ID + "$", "");

        if (name == "id")
            value = value.Replace(CONTENT_NAME + "_", "").Replace(MASTER_PAGE_ID + "_", "");

        base.WriteAttribute(name, value);
    }
}

وبعد ذلك يمكنك استخدام مثل هذا:

protected override void Render(HtmlTextWriter writer)
{
    base.Render(new CleanHtmlTextWriter(writer));
}

في الواقع، للاستفادة من إجابة جوش، وجدت أن الحل الأول أدناه يمثل مشكلة مع عناصر التحكم في الإدخال الأخرى وأن PostBacks لا يعمل بشكل صحيح.لذا، بدلاً من إجراء تغيير فارغ، اخترت الحل الثاني أدناه لتغيير JavaScript بدلاً من اسم العنصر.

حل جوش:

كود خلف:

protected override void Render(System.Web.UI.HtmlTextWriter writer)
{
    StringWriter Html = new StringWriter();
    HtmlTextWriter Render = new HtmlTextWriter(Html);
    base.Render(Render);
    writer.Write(Html.ToString()
        .Replace("name=\"ctl00$ContentBody$", "name=\"")
        .Replace("id=\"ctl00_ContentBody_", "id=\""));
}

الحل 1, ، مع مشكلات PostBack (ملاحظة:لم أتمكن من تغيير المعرف الذي قد يحل هذا الحل):

كود خلف:

protected override void Render(System.Web.UI.HtmlTextWriter writer)
{
    var html = new StringWriter();
    var render = new HtmlTextWriter(html);
    base.Render(render);
    writer.Write(html.ToString()
        .Replace("name=\"ctl00$contentBody$rbl",
                 "name=\"ctl00_contentBody_rbl"));
}

الحل 2, لتغيير جافا سكريبت:

JavaScript في ملف aspx حيث تستخدم قوائم أزرار الاختيار الاصطلاح "rbl[name]':

if (!validateRadioButtonList("<% =rblTitle.ClientID %>"))

كود خلف:

protected override void Render(System.Web.UI.HtmlTextWriter writer)
{
    var html = new StringWriter();
    var render = new HtmlTextWriter(html);
    base.Render(render);
    writer.Write(html.ToString()
        .Replace("validateRadioButtonList(\"ctl00_contentBody_rbl", 
                 "validateRadioButtonList(\"ctl00$contentBody$rbl"));
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top