سؤال

أنا استخدم مسج و SimpleModal في مشروع ASP.Net لإجراء بعض مربعات الحوار الرائعة لتطبيق ويب.لسوء الحظ، لم يعد بإمكان أي أزرار في مربع حوار مشروط تنفيذ عمليات إعادة النشر الخاصة بها، وهو أمر غير مقبول حقًا.

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

لدي أيضًا حل بديل، وهو استبدال عمليات إعادة النشر، ولكنه قبيح وربما ليس الأكثر موثوقية.أود حقًا أن أجعل عمليات إعادة النشر تعمل مرة أخرى.أيه أفكار؟

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

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

المحلول

كلاكما كان على الطريق الصحيح.ما أدركته هو أن SimpleModal يُلحق مربع الحوار بالنص الموجود خارج ASP.Net <form>, ، مما يعطل الوظيفة، لأنه لا يمكنه العثور على العناصر.

لإصلاح هذه المشكلة، قمت للتو بتعديل مصدر SimpleModal لإلحاق كل شيء به 'form' بدلاً من 'body'.عندما أقوم بإنشاء مربع الحوار، أستخدم أيضًا ملف persist: true الخيار، للتأكد من بقاء الأزرار خلال الفتح والإغلاق.

شكرا للجميع على المقترحات!

تحديث: الإصدار 1.3 يضيف appendTo خيار في التكوين لتحديد العنصر الذي يجب إلحاق مربع الحوار المشروط به. هنا المستندات.

نصائح أخرى

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

في ظاهر الأمر، لا أستطيع رؤية أي شيء في SimpalModal من شأنه أن يفسد نموذج صفحتك أو أي من المدخلات المخفية القياسية، إلا إذا كانت محتويات هذا النموذج تأتي من HTTP GET إلى صفحة ASP.NET.قد يؤدي ذلك إلى عرض نموذجي ASP.NET في DOM واحد ومن المؤكد أنه سيؤدي إلى إفساد وظيفة __doPostBack.

هل فكرت في استخدام التحكم في ASP.NET AJAX ModalPopup?

لن تقوم متصفحات الويب بنشر أي عناصر نموذج معطلة أو مخفية.

إذن ما يحدث هو:

  1. ينقر المستخدم على زر في مربع الحوار الخاص بك.
  2. يستدعي الزر طريقة SimpleModal's Close()، ويخفي مربع الحوار والزر
  3. يقوم العميل بنشر النموذج (بدون معرف الزر)
  4. لا يستطيع إطار عمل ASP.NET معرفة الزر الذي تم النقر عليه
  5. لا يتم تنفيذ التعليمات البرمجية من جانب الخادم الخاص بك.

الحل هو القيام بكل ما تريد القيام به على العميل (إغلاق مربع الحوار في هذه الحالة) ثم الاتصال بـ __doPostback() بنفسك.

على سبيل المثال (حيث يكون "dlg" هو مرجع حوار SimpleModal من جانب العميل):

btn.OnClientClick = string.Format("{0}; dlg.close();",
                        ClientScript.GetPostBackEventReference(btn, null));

من المفترض أن يؤدي ذلك إلى إخفاء مربع الحوار وإرسال النموذج واستدعاء أي حدث من جانب الخادم لديك لهذا الزر.

@ دان

تعمل جميع عمليات إعادة النشر القياسية لـ ASP.NET عن طريق استدعاء طريقة جافا سكريبت __doPostBack على الصفحة.

asp: لا تستدعي الأزرار __doPostback() لأن عناصر تحكم إدخال HTML ترسل النموذج بالفعل.

لقد اكتشفنا هذا - شكرًا جزيلاً لـ tghw وجميع المساهمين الآخرين في نموذج الملحق بدلاً من إصلاح الجسم.(تم حلها بواسطة السمات الموجودة في الإصدار 1.3)

بالمناسبة:إذا أراد أي شخص إغلاق مربع الحوار برمجيًا من .net - فيمكنك استخدام هذا النوع من بناء الجملة

private void CloseDialog()
{
    string script = string.Format(@"closeDialog()");
    ScriptManager.RegisterClientScriptBlock(this, typeof(Page), UniqueID, script, true);
}

حيث يكون جافا سكريبت الخاص بـ Closedialog مثل هذا ....

    function closeDialog() {
        $.modal.close();
    }

لقد وجدت الأعمال التالية دون تعديل simplemodal.js:

function modalShow(dialog) {

    // if the user clicks "Save" in dialog
    dialog.data.find('#ButtonSave').click(function(ev) {
        ev.preventDefault();

        //Perfom validation                

        // close the dialog
        $.modal.close();

        //Fire the click event of the hidden button to cause a postback
        dialog.data.find('#ButtonSaveTask').click();
    });

    dialog.data.find("#ButtonCancel").click(function(ev) {
        ev.preventDefault();
        $.modal.close();
    });
}          

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

FWIW، لقد قمت بتحديث ملف مشاركة المدونة التي أشرت إليها مع التوضيح، أعيد نشره هنا - الأسباب والتفاصيل الأخرى موجودة في منشور المدونة:

الحل (اعتبارًا من آخر تسجيل وصول لي قبل الغداء):

  1. تجاوز حدث onClose الخاص بمربع الحوار، ثم قم بما يلي:
    1. قم باستدعاء وظيفة الإغلاق الافتراضية لمربع الحوار
    2. قم بتعيين HTML الداخلي لمربع الحوار على واحد
    3. Hijack __doPostBack، وتوجيهه إلى وظيفة جديدة، newDoPostBack

من بعض التعليقات التي رأيتها على الويب، تحتاج النقطة 1 إلى بعض التوضيح.لسوء الحظ، لم أعد أعمل مع نفس صاحب العمل، ولا يمكنني الوصول إلى الرمز الذي استخدمته، ولكنني سأفعل ما بوسعي.أولاً، تحتاج إلى تجاوز وظيفة onClose الخاصة بمربع الحوار عن طريق تحديد وظيفة جديدة وتوجيه مربع الحوار إليها، كما يلي:

$('#myJQselector').modal({onClose: mynewClose});
  • قم باستدعاء وظيفة الإغلاق الافتراضية لمربع الحوار.في الوظيفة التي تحددها، يجب عليك أولاً استدعاء الوظيفة الافتراضية (أفضل ممارسة لأي شيء تقوم بتجاوزه عادة):
  • قم بتعيين HTML الداخلي لمربع الحوار على واحد– هذه ليست خطوة مطلوبة، لذا قم بتخطيها إذا لم تفهمها.
  • Hijack __doPostBack، وتوجيهه إلى وظيفة جديدة، newDoPostBack
function myNewClose (dialog)
{
    dialog.close();
    __doPostBack = newDoPostBack;
}
  1. اكتب الدالة newDoPostBack:
function newDoPostBack(eventTarget, eventArgument)
{
    var theForm = document.forms[0];
    if (!theForm)
    {
        theForm = document.aspnetForm;
    }
 
    if (!theForm.onsubmit || (theForm.onsubmit() != false))
    {
        document.getElementById("__EVENTTARGET").value = eventTarget;
        document.getElementById("__EVENTARGUMENT").value = eventArgument;
        theForm.submit();
    }
}
    

يحتوي Jquery.simplemodal-1.3.js الجديد على خيار يسمى appendTo.لذا أضف خيارًا يسمى appendTo:'form' لأن الخيار الافتراضي هو appendTo:'body' والذي لا يعمل في asp.net.

كان لديه نفس المشكلة، ولكن {appendTo:'form'} تسبب في عرض النافذة المنبثقة المشروطة بشكل خاطئ تمامًا (كما لو كان لدي مشكلة في CSS).

تبين أن القالب الذي أقوم بإنشائه فوقه يتضمن نماذج أخرى على الصفحة.بمجرد تعيين {appendTo:'#aspnetForm'} (معرف نموذج Asp.net الافتراضي)، كل شيء سار بشكل رائع (بما في ذلك إعادة النشر).

بالإضافة إلى إجابة tghw، ساعدني هذا المنشور الرائع في المدونة: مسج:قم بإصلاح عمليات إعادة النشر الخاصة بك في النماذج المشروطة - على وجه التحديد تعليق BtnMike:"يجب ألا يكون لديك أيضًا cssclass =" simplemodal-close "على ASP: الزر." كان خلع ذلك من الفصل هو الحل غير المتنقل.

-جون

إذا كنت لا تريد تعديل مصدر SimpleModal.جرب هذا..

بعد استدعاء الأسلوب modal() أضف هذا:

$("#simplemodal-overlay").appendTo('form');
$("#simplemodal-container").appendTo('form');

يضيف البرنامج المساعد SimpleModal اثنين من هذه إلى العلامات الخاصة بك.

  1. "تراكب مشروط بسيط" للخلفية
  2. تحتوي "حاوية الوسائط البسيطة" على القسم الذي تريده كشكل منبثق.
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top