ASP.Net + مسج + مسج التحقق من صحة البرنامج المساعد + UpdatePanel + nyroModal - نجاح اطلاق النار على كل حقل!

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

سؤال

ولدي نموذج يحتوي على قائمة من حقول الإدخال التي بملء المستخدم مع الأسعار (أرقام). لقد حددت الطبقات المغلق ل"المطلوبة" و "رقم" بحيث التحقق من صحة البرنامج المساعد مسج يؤكد وفقا لذلك. كل ما تعمل بشكل جيد تماما. يتم عرض أخطاء عند كل حقل إما غير رقم أو قيمة مفقود وما إلى ذلك.

وهذا النموذج بأكمله هو في الواقع داخل nyroModal (مسج المساعد) نافذة النموذج المنبثقة. ولكن هذا لا ينبغي أن يهم، مجرد نموذج ويب .ASPX لها بغض النظر. في غضون ذلك، ولقد استخدمت أيضا UpdatePanel ووضع كل شيء في داخله، لأن مستواي هو في جوهره عملية 2 المرحلة. هناك بعض الخطوات الأساسية يجب على المستخدم إكمال على "الصفحة" الأولى من النموذج. عندما يؤكد أن ويعمل، وأنا مجرد إخفاء / إظهار بعض العناصر داخل UpdatePanel لتظهر للمستخدم "الصفحة" القادمة من النموذج، الذي هو كل حقول الإدخال سعر النص كما هو موضح أعلاه.

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

وبعد الكثير من القراءة، وأنا بحاجة إلى وسيلة لنعلق على PageRequestManager صافي في جافا سكريبت كي أتمكن من اعتراض عندما أراد صافي القيام إعادة النشر، على أساس إذا كان مسج التحقق من صحة النموذج بنجاح أم لا. هكذا يقول منطق بلدي: افتراضيا، لا تسمح إعادات النشر، ولكن عندما يؤكد مسج النموذج بنجاح، تعيين متغير التي تقول أن يسمح إعادات النشر الآن، ثم في المرة التالية يحاول إعادة النشر أن يحدث، وسوف تمر. وبالتالي عرض النجاح للمستخدم.

وهذا هو نوع تعمل جميع بشكل معقول، ولكن هناك مشكلة واحدة نهائية.

و({نجاح}) خيار التحقق من صحة والتحقق من صحة البرنامج المساعد مسج ويبدو أن إطلاق النار عن طريق الخطأ بعد التحقق من صحة ناجحا في كل حقل على حدة، وليس النموذج بأكمله. بمعنى آخر. إذا كنت إدخال رقم في أي من حقول الإدخال الأسعار، وهذا الخيار نجاح اطلاق النار ووضع بلدي متغير cancelPostback إلى false، وهذا بدوره يعني أن النموذج يقدم الآن حتى لو لم يتم التحقق من صحة ذلك، كان المجال بسبب واحد فقط صالح. كنت أتوقع الخيار هذا التحقق من صحة ({نجاح}) إلى النار مرة واحدة فقط تم التحقق من صحة النموذج بأكمله.

هل لديك I تفسير هذا غير صحيح، والواقع في القيام بما يعني لها أن تكون؟ إذا كان الأمر كذلك، كيف يمكنني ببساطة وضع بلدي متغير cancelPostback إلى true فقط عندما يتم التحقق من صحة النموذج بأكمله؟

وبفضل أكوام عن أي فكرة أو رؤساء متابعة.

وبلدي مسج التعليمات البرمجية لتنفيذ المصادقة وأيضا اعتراض الحدث صافي إعادة النشر كما يلي:

<script type="text/javascript">
    // By default, don't allow Postback until we've successfully validated our form on the client-side.
    var cancelPostback=true;

    // Every single time the page loads, including every single AJAX partial postback
    function pageLoad()
    {
        // Reset the value to say that "We don't allow Postbacks at this stage"..
        cancelPostback=true;

        // Attach client-side validation to the main form
        $("#<%= form1.ClientID %>").validate({ success: function() { alert('validation succeeded!'); cancelPostback = false; } });

        // Grab a reference to the Page Request Manager
        var prm = Sys.WebForms.PageRequestManager.getInstance();
        prm.add_initializeRequest(onEachRequest);

        alert("Page Load");
    }

    // Our own custom method to be attached to each new/future page request..
    function onEachRequest(sender, args)
    {
        alert("About to cancel? " + cancelPostback);
        // Check to see if we need to Cancel this Postback based on Conditional Logic within this page..
        args.set_cancel(cancelPostback);
    }
</script>
هل كانت مفيدة؟

المحلول

وأود أن أقترح النظر في خيارات submitHandler وinvalidHandler. واحدة أو أخرى يجب أن تعمل من أجل ما تريد. أعتقد أن أفضل طريقة ستكون للسماح إعادات النشر افتراضيا وتعيين cancelPostback إلى true في invalidHandler. بدلا من ذلك، يمكن أن تكتب submitHandler بنفسك أن يدعو __doPostBack مباشرة ويحل محل تقديم عبر ImageButton.

نصائح أخرى

وكان لي مشاكل مع الحل لجميع المتصفحات باستثناء IE كانوا يطلقون النار على وظيفة "onEachRequest" قبل وظيفة المدقق مسج لsubmitHandler (). جئت إلى حل أكثر أناقة يلغي ببساطة إعادة النشر إذا فشل التحقق من الصحة، بدلا من الاعتماد على متغير معين.

  Sys.Application.add_init(function() {
    var prm = Sys.WebForms.PageRequestManager.getInstance();
    prm.add_initializeRequest(onEachRequest);
  }); 

  function onEachRequest(sender, args) {
    if (args.get_postBackElement().id == <%= [YourSubmitButton].ClientID %>) {
      args.set_cancel(!$('#aspnetForm').valid());
    }
  }

وبفضل أكوام tvanfosson للمساعدة عاجلة.

والتحديث طيب:

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

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

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

وبالتالي فإن الحل النهائي شبه kludgey، وهذا ليس سيئا للغاية أن نكون صادقين، كان:

ولقد غيرت هذا الخط إلى:             // إرفاق التحقق من جانب العميل إلى النموذج الرئيسي             . $ ( "# <٪ = form1.ClientID٪>") تحقق ({submitHandler: وظيفة () {PreventPostback = كاذبة؛ __doPostBack ( 'UpdatePanel1'، '')؛}})؛

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

وأزلت أساليب الحدث من وراء ImageButtons، وقدم طريقة جديدة في رمز جانب الملقم يسمى "DoPostBackLogic ()" وهو ما يسمى فقط عند عرض الصفحة نشرها مرة أخرى، وأنا أعلم أنك يجب أن يكون من هذا المنطق التحقق من صحة ، لأن هذا هو إعادة النشر الوحيد الذي يمكن أن يحدث في النموذج. بعد ذلك كل من إخفاء / إظهار / حفظ المنطق يحدث في وجود بالنسبة لي. وهو ما يعني وأنا عندما استدعاء __doPostBack يدويا، ويمكن ببساطة استخدام معرف UpdatePanel ولا تقلق بشأن محاكاة لImageButton معين وما إلى ذلك.

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

وهكذا هذا هو أساسا الحل الثاني، وذلك بفضل مرة أخرى للاستماع وتبادل! :)

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