سؤال

أود أن أبدأ بالقول إن الكود الخاص بي يعمل بشكل مثالي ، فهذا نوع من الأسئلة "أفضل طريقة لفعل ذلك".

لذلك لدي رمز مثل هذا في بلدي .aspx ملف:

    function EditRelationship() {
        var projects=<%= GetProjectsForEditRelationship() %>;

        // fill in the projects list
        $('#erProjectsSelect').empty();
        for(var i in projects)
            $('#erProjectsSelect').append('<option value='+projects[i][0]+'>'+projects[i][1]+'</option>');

        var rels=<%= GetRelationshipsForEditRelationship() %>;

        // etc
    }

مرة أخرى ، إنه يعمل بشكل جيد. المشكلة هي أن VS2008 kinda يختنق على كود مثل هذا ، فهي تؤكد < الحرف في العلامات (مع تحذيرات مرتبطة) ، ثم رفض توفير إكمال رمز لبقية JavaScript. كما أنه يرفض تنسيق وثيقي بعد الآن ، مع إعطاء أخطاء التحليل. الجزء الأخير هو أسوأ انزعاج لي.

يمكنني وضع بعض هذه في evalأعتقد ، ولكن يبدو أنه من الغباء إضافة طبقات إضافية وأداء وقت التشغيل فقط لإغلاقها مقابل Up ، وهذا ليس خيارًا دائمًا (لا أستطيع أن أتذكر الجزء العلوي من رأسي حيث لم يكن هذا خيارًا بل ثقة لي كان لدي بناء غريب).

لذا سؤالي هو ، كيف يمكنك كتابة هذا أفضل (حيث يعني أفضل عدد أقل من الشكاوى مقابل الشكاوى)؟ لا هذا ولا ذاك eval ولا مكالمات AJAX تناسب هذا المنظمة البحرية الدولية.

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

المحلول

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

  1. إنشاء ASP: Hiddenfield Control ، اضبط ClientIdMode على "ثابت"
  2. تعيين قيمة getRelationshipsforeditrelationship () لهذا الحقل على تحميل الصفحة
  3. في JavaScript الخاص بك ، اقرأ القيمة من الحقل المخفي بدلاً من ذلك ، أفترض أنك تعرف كيفية القيام بذلك.

إنه عمل أكثر من الحل الخاص بك ، وسوف تضيف بعض البيانات إلى Postback (إذا قمت بأي شيء) ولكنه لن يتسبب في أي شكاوى VS أعتقد :)

نصائح أخرى

يمكنك القيام بذلك من صفحتك في الكود

ClientScript.RegisterArrayDeclaration("projects", "1, 2, 3, 4");

أو لبناء شيء مثل JSON يمكنك كتابته

ClientScript.RegisterClientScriptBlock(GetType(), "JSONDeclarations", "your json stuff");

تحديث بناء على تعليقي

<script id="declaration" type="text/javascript">
    var projects=<%= GetProjectsForEditRelationship() %>;
    var rels=<%= GetRelationshipsForEditRelationship() %>;
</script>
<script type="text/javascript">
    function EditRelationship() {
        // fill in the projects list
        $('#erProjectsSelect').empty();
        for(var i in projects)
            $('#erProjectsSelect').append('<option value='+projects[i][0]+'>'+projects[i][1]+'</option>');
}
</script>

ليس لدي VS2008 مثبت للاختبار ، لذا خذ هذا مع حبة من الملح ، لكن هل جربت شيئًا كهذا؟

var projects = (<%= GetProjectsForEditRelationship() %>);

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

من أجل ما يستحق ، فإن VS2010 يرقل بشكل صحيح ويسلط الضوء على مقتطف الرمز الأصلي.

هل هو خيار لنقل هذا إلى VS2010؟ لقد قمت للتو بنسخ ولصق الكود الخاص بك وتفسير IDE بشكل صحيح.

أفضل حل هو وضع JavaScript في ملف منفصل وتجنب ذلك تمامًا. لهذه الوظيفة بالذات ، أنت تقوم بعمل من جانب الخادم. لماذا لا تقوم ببناء قائمة الخيارات التي تنوي إضافتها ديناميكيًا في CodeBehind ، ووضعها في Div مخفي ، ومن ثم جعلها jQuery تضافها من HTML المعروفة بالفعل؟

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

ScriptManager.RegisterClientScript("projects = " + GetProductsForEditRelationship());

(في الأساس ، هذا ليس بناء الجملة الكامل ، والذي يعتمد على السياق). ثم الرجوع إلى "المشاريع" في وظيفتك.

(تعديل)

طريقة أنظف صغيرة للقيام بذلك على نطاق أوسع ، قم بإعداد كل ما تحتاجه مثل هذا في CodeBehind:

string script = "var servervars = {" +
  "GetProductsForEditRelationship: " + GetProductsForEditRelationship() + 
  "GetRelationshipsForEditRelationship: " + GetRelationshipsForEditRelationship() +
"}"

والرجوع إلى كل شيء مثل:

servervars.GetProductsForEditRelationship

إذا قمت بذلك كثيرًا ، بالطبع ، يمكنك إنشاء فصل لأتمتة بناء البرنامج النصي.

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