سؤال

ولدي صفحة على شبكة الإنترنت القياسية ASP.NET 2.0 مع زر حذف على ذلك. ما أحتاج ولا يمكن معرفة كيفية سحب قبالة عندما يضغط المستخدم على زر حذف بالنوافذ الحوار تأكيد يطلب المستخدم "هل أنت متأكد؟". إذا قال نعم المستخدم ثم أريد أن تعطيل زر الحذف وإجراء إعادة النشر الذي سيقوم بتشغيل deleteButton_Click كود جانب الملقم.

وهنا هو العلامة:

<asp:Button ID="deleteButton" Text="Delete" OnClick="deleteButton_Click" runat="server" />

وهنا جافا سكريبت (في مسج) للتعامل مع النقر العميل:

var deleteButton = $(input.eq(0));
deleteButton.click( function()
{
    var a = confirm( "Are you sure you want to delete this item?" );
    if ( a == false )
    {
        return false;
    }
    else
    {
        deleteButton.attr( "disabled", "disabled" );
        __doPostBack( deleteButton.attr( "id" ), "" );
    }
} );

والحوار تأكيد يعمل كما هو متوقع وتعطيل عمل طيب جدا. شكل لا إعادة النشر غرامة ولكنه لا يعمل معالج الأحداث deleteButton_Click. موجود في __doPostBack شفرة جافا سكريبت على الصفحة.

وبوسعي أن أضيف UseSubmitBehavior = "كاذبة" إلى العلامة deleteButton ولكن بعد ذلك سوف تتجاهل الإجابة الحوار تأكيد.

وهكذا ربما أنا يطلب الكثير من ASP.NET هنا. أي أفكار كيفية جعل هذا العمل؟

شكرا،

وكريغ

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

المحلول 3

وشكرا لردود الفعل ولكنه كان حلا بسيطا إلى حد ما.

ويجب أن يكون خط جافا سكريبت:

__doPostBack( deleteButton.attr( "name" ), "" );

وبدلا من:

__doPostBack( deleteButton.attr( "id" ), "" );

لم أكن أدرك أن "اسم" السمة هي التي أسلوب doPostBack كان يبحث عنه.

نصائح أخرى

btnSubmit.Attributes.Add("onclick", "if(confirm(\"Are you sure you want to delete this item?\" ){this.disabled=true;" + ClientScript.GetPostBackEventReference(btnSubmit, "").ToString() + "}else{return false;}");

ونلقي نظرة على هذا السؤال ستاكوفيرفلوو لقد وجدت أنه من المفيد جدا:

زر تعطيل على استمارة التقديم

إضافة منطق تأكيد ... ويجب أن يتم تعيين ...

وذهبت رئيس وكتب طريقة تمديد بالنسبة لك، وأنا أيضا:)

public static void ConfirmThenDisableButtonOnClick(this Button buttonControl, string confirmMessage, string clientFunction)
{
    StringBuilder sb = new StringBuilder();

    // If the page has ASP.NET validators on it, this code ensures the
    // page validates before continuing.
    if (buttonControl.CausesValidation && !String.IsNullOrEmpty(buttonControl.ValidationGroup))
    {
        sb.Append("if ( typeof( Page_ClientValidate ) == 'function' ) { ");
        sb.AppendFormat(@"if ( ! Page_ClientValidate('{0}') ) {{ return false; }} }} ", buttonControl.ValidationGroup);
    }

    //pop confirm, if confirm==true, disable button
    sb.AppendFormat("if(confirm('{0}\')){{this.disabled=true;", confirmMessage.Replace("\"","").Replace("'",""));

    // If a secondary JavaScript function has been provided, and if it can be found,
    // call it. Note the name of the JavaScript function to call should be passed without
    // parens.
    if (!String.IsNullOrEmpty(clientFunction))
    {
        sb.AppendFormat("if ( typeof( {0} ) == 'function' ) {{ {0}() }};", clientFunction);
    }

    // GetPostBackEventReference() obtains a reference to a client-side script function 
    // that causes the server to post back to the page (ie this causes the server-side part 
    // of the "click" to be performed).
    sb.Append(buttonControl.Page.ClientScript.GetPostBackEventReference(buttonControl, ""));

    // if confirm==false do nothing
    sb.Append(";}else{return false;}");

    // Add the JavaScript created a code to be executed when the button is clicked.
    buttonControl.Attributes.Add("onclick", sb.ToString());
}

وأضاف مجرد التحقق من صحة فحص أيضا:)

وبدلا من القيام إعادة النشر من خلال جافا سكريبت، يمكنك استخدام OnClientClick لإنجاز نفس الشيء.

<asp:Button OnClientClick="if (confirm('Are you sure?')) {this.disabled = true;} else {return false;}" />

وأو إذا كنت ترغب في تنفيذ المزيد من الإجراءات من خلال جافا سكريبت من مجرد تعطيل زر، يمكنك أن تقول شيئا مثل هذا:

<asp:Button OnClientClick="return DisableOnConfirm();" />

وتحتاج فقط للتأكد من أنك صياغة ذلك في شكل عبارة إرجاع حتى عندما كنت لا تريد وظيفة ASP لتشغيل، فإن بيان وتقول في النهاية "عودة كاذبة."

.

وجافا سكريبت:

deleteButton.disabled = true;

وC #:

deleteButton.Enabled = false;

وربما يجب عليك تعطيل زر على جانب الملقم في حال deleteButton_Click (لأنك لن تفعل إعادة النشر، لذلك يمكنك إعادة إنشاء الصفحة).

<asp:Button ID="deleteButton" Text="Delete" OnClick="deleteButton_Click" runat="server" OnClientClick="javascript:return confirm('are you sure blah blah blah ...')" />

وفي التعليمات البرمجية الخلفية:

private void deleteButton_Click(object sender, EventArgs e) {
    deleteButton.Enabled = false;
    // and the rest of event handling ...
}

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

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

وعلى أي حال، في محاولة <٪ @ صفحة EnableEventValidation = "كاذبة"٪> على صفحة ASPX الخاص بك ومعرفة ما اذا كان يعمل (ويقع إلى true افتراضيا). أنا لا أتذكر التفاصيل الجوهرية لهذه الأعمال السمة ولكن هذه الميزة يتأكد أن يتم تشغيل الحدث جانب الملقم إلا في الحالات المشروعة. مثلا دعنا نقول كان صفحتك الضعف XSS والقراصنة حقن جافا سكريبت لاستدعاء زر الحذف. هذه السمة يساعد على منع تلك الهجمات.

$(":submit").click(function ()
{
    $(this).attr("disabled", true); // disable input

    if (confirm("Press OK to submit"))
    {
        __doPostBack(this.id, ""); // if user presses OK; submit
    }
    else
    {
        // If user presses cancel; enable input and stop submit
        $(this).attr("disabled", false);

        return false;
    }
});

وأنا قررت أن تجعل هذا وظيفة JS التي يمكن استدعاؤها من أي زر.

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

<script>
    function confirmPostback(button) {
        if (confirm('Are you sure?')) {
            button.disabled = true;
            __doPostBack(button.name, '')
            return true;
        } else {
            return false;
        }
    }
</script>

<asp:Button ID="TestPostback" runat="server" Text="Test Postback"
        UseSubmitBehavior="false" OnClientClick="return confirmPostback(this)" />
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top