سؤال

أنا المعلومات المهندس المعماري جافا سكريبت المطور عن طريق التجارة في الوقت الحاضر, لكن في الآونة الأخيرة لقد تم الحصول على العودة إلى الخلفية الترميز مرة أخرى.و حين تحاول الحصول على HTML النموذج المتكامل مع C#على أساس CMS, لقد جئت إلى الضربات مع المبرمجين لدينا أكثر HTML ID سمات تعسفي إعادة كتابة من قبل .صافي عناصر النموذج.

أستطيع أن أفهم البرمجية-خلف المنطق .صافي تغيير المعرفات ، ولكن الحقيقة لا يمكن استخدام معرفات عندما تحاول تطوير مثلمسج تعزيز واجهات يسبب بعض الاحتكاك.ماذا يمكنني أن أفعل للتغلب على هذا ؟

لقد حاولت استخدام سمة فئة بدلا من ذلك ، ولكن هذا حقا سيء, لا ما أقصد و لا حول تلك المشكلة .صافي فعالة في تغيير المقدمة مصدر على الطاير.وهذا يعني أيضا أن CSS هو أقل فائدة الآن أقل كفاءة لخلق و الحفاظ عليها.

أي نصائح أو مشورة تقدير كبير أي شيء لبضع أقل الليالي الطوال...

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

المحلول

الجواب القصير هو لا, مع webforms معرف يمكن دائما إعادة كتابة اعتمادا على تداخل العنصر.يمكنك الحصول على الرقم من خلال ClientID الملكية ، لذلك يمكن تعيين معرفات إلى المتغيرات في البرنامج النصي في نهاية الصفحة/التحكم ثم وضعها في مسج.

شيء من هذا القبيل:

<asp:button id="ImAButton" runat="server">Click Me</asp:button>

<script type="text/javascript">
var buttonId = "<%=ImAButton.ClientId%>";
$("#"+buttonId).bind('click', function() { alert('hi); });
</script>

انها الإختراق أعلم, ولكن سيكون العمل.(أود أن أشير إلى الأمم المتحدة بعد أن بدأت أنا باستخدام النموذج $ الحصول على معرف طريقة هناك)

نصائح أخرى

أسلوب واحد هو تجاوز هذا الرقم يدويا:

public override string UniqueID
{
  get { return this.ID; }
}
public override string ClientID
{
  get { return this.ID; }
}

ريك Strahl كتب بلوق وظيفة مع بعض مزيد من المعلومات حول هذا النهج.

انظر ASP.Net MVC - يعالج على قتل كائن ترتبيات ASP.Net يولد بشكل افتراضي.

هذا الموقع هو مكتوب في MVC (أعتقد) - انظر في ذلك الهيكل.كنت أعمل على مشروع جديد الآن أود أن تنظر أولا

إذا كنت عالقا مع الأساسية ASP.Net ثم تكون حذرا تجاوز ClientID و UniqueID - أنه يميل إلى كسر العديد من عناصر التحكم على شبكة الإنترنت.

أفضل طريقة وجدتها هي لتمرير غير قابل للقراءة ClientID إلى جافا سكريبت.

يمكنك تمديد .صافي الضوابط وجعلها العودة الفعلية id عندما الخصائص المتعلقة تسمى.

ClientID هو السمة id و UniqueID هو اسم السمة من عناصر html.لذلك عند إنشاء مربع نص كما يلي و استخدام هذا بدلا من النص في الإطار ، تقوم معرف اسم سمات تجعل نفس الخادم الهوية.

public class MyTextBox : TextBox
{
    public override string ClientID { get { return ID; } }
    public override string UniqueID { get { return ID; } }
}

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

<%@ Register Assembly="MyLibrary" NameSpace="MyLibrary.WebControls" TagPrefix="MyPrefix" %>

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

<MyPrefix:MyTextBox ID="sampleTextBox" runat="server" />

أنا شخصيا استخدام مجموعة من الأساليب لقد وضعت لسد جانب الخادم ASP.NET "السحر" (لم تستخدم MS MVC الاشياء بعد) و تعليمات برمجية من جانب العميل بسبب munging من معرفات أن يحدث.هنا هو واحد فقط الذي قد أو قد لا تكون مفيدة:

public void RegisterControlClientID(Control control)
{
   string variableDeclaration = string.Format("var {0} = \"{1}\";", control.ID, control.ClientID);
   ClientScript.RegisterClientScriptBlock(GetType(), control.ID, variableDeclaration, true);
}

حتى في تعليمات برمجية من جانب الخادم يمكنك ببساطة استدعاء هذا و تمر في حالة عنصر التحكم الذي تريد استخدامه ودا اسم.وبعبارة أخرى, خلال وقت التصميم, قد يكون لديك مربع نص مع معرف "m_SomeTextBox" و كنت تريد أن تكون قادرة على كتابة جافا سكريبت الخاصة بك باستخدام نفس اسم - يمكنك ببساطة استدعاء هذا الأسلوب في تعليمات برمجية من جانب الخادم:

RegisterControlClientID(m_SomeTextBox);

ثم على العميل وفيما يلي المقدمة:

var m_SomeTextBox = "ctl00_m_ContentPlaceHolder_m_SomeTextBox";

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

عادة ما أقوم به هو إنشاء الوظيفة العامة الذي يتلقى اسم الحقل.وتضيف المعتاد "asp.net" البادئة بإرجاع كائن.

var elemPrefix = 'ctl00-ContentPlaceHolder-'; //replace the dashes for underscores

var o = function(name)
{    
    return document.getElementById(elemPrefix + name)
}

مع أنه يمكنك استخدام هذا النوع من المكالمات في مسج

$(o('buttonId')).bind('click', function() { alert('hi); });

أنت بالتأكيد لا تريد أن الثابت-كود asp.صافي إنشاء معرف في CSS الخاص بك لأنه يمكن أن تتغير إذا كنت إعادة ترتيب الأشياء على الصفحة الخاصة بك في مثل هذه طريقة أن التحكم الخاصة بك شجرة التغييرات.

أنت على حق أن CSS معرفات لها مكانها, لذلك أود أن تجاهل اقتراحات فقط استخدام الطبقات.

مختلف جافا سكريبت الخارقة الموصوفة هنا هي مبالغة مشكلة صغيرة.حتى يرث من فئة تجاوز الخاصية معرف.وانها بالتأكيد ليست مفيدة تشير إلى التحول إلى MVC عند كل ما تريد القيام به هو ريفاكتور بعض CSS.

فقط منفصلة divs ويمتد التي تستهدفها مع CSS.لا تستهدف ASP.NET الضوابط مباشرة إذا كنت ترغب في استخدام معرفات.

  <div id="DataGridContainer">
     <asp:datagrid runat=server id="DataGrid" >
         ......
     <asp:datagrid>
  </div>

إذا كنت تستخدم مسج ثم لديك الكثير من محددات CSS و jQuery custome محددات تحت تصرفكم لاستهداف العناصر على الصفحة الخاصة بك.وذلك بدلا من اختيار زر الإرسال عن طريق id, هل يمكن أن تفعل شيئا مثل:

$('fieldset > input[type="submit"]').click(function() {...});

أستطيع أن أرى كيف .صافي النظام يشعر أقل بديهية, ولكن تعطيه فرصة.في تجربتي أنه في الواقع ينتهي إنشاء رمز النظيف.متأكد

<asp:button id="ImAButton" runat="server">Click Me</asp:button>

<script type="text/javascript">
var buttonId = <%=ImAButton.ClientId%>
$(buttonId).bind('click', function() { alert('hi); });
</script>

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

<script type="text/javascript">
function MakeAClick(inid)
{
  $(inid).bind('click', function() { alert('hi); });
}
</script>

ثم في وقت لاحق مع التعليمات البرمجية في جافا أو C# الجانبية اتصل MakeAClick.بالطبع على C# جانب من المنطقي أكثر ، أنت فقط ClientID هناك.

ربما هذه هي المشكلة الحقيقية مع رمز أنت استعراض.

أفضل نهج استخدام ClientIDMode وضعه على static.يمكنك حتى تعيين صفحة محددة أو على الصعيد العالمي في شبكة الإنترنت.ملف التكوين.فإنك لن تضطر إلى التعامل مع هذه المسألة مرة أخرى و مسج هو أنظف بكثير.

في أعلى الصفحة:

<%@ Page Title="" ClientIDMode="Static" Language="C#" CodeBehind="..." Inherits="WebApplication1.WebForm2"  %>

على التحكم فقط:

<asp:Panel runat="server"  ClientIDMode="Static"></asp:Panel>
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top