Frage

Ich habe eine Standard ASP.NET 2.0 Web-Seite mit einer Schaltfläche Löschen auf sie. Was ich brauche, und kann nicht herausfinden, wie ziehen aus, wenn der Benutzer auf die Schaltfläche Löschen Popups ein Bestätigungsdialog drückt den Benutzer zu fragen: „Sind Sie sicher?“. Wenn der Benutzer sagt, ja, dann mag ich auf die Schaltfläche Löschen deaktivieren und ein Postback auszuführen, der den Server-seitigen Code deleteButton_Click ausgeführt wird.

Hier ist der Tag:

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

Hier ist die Javascript (in jquery) die Client-Seite klicken zu behandeln:

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" ), "" );
    }
} );

Der Bestätigungsdialog funktioniert wie erwartet und die Sperrung funktioniert auch ok. Die Form macht Postbacks in Ordnung, aber es nicht die deleteButton_Click Event-Handler ausgeführt werden. Der __doPostBack Javascript-Code existiert auf der Seite.

kann ich UseSubmitBehavior = „false“ zum DeleteButton Tag hinzufügen, aber dann wäre es das Bestätigungsdialog Antwort ignorieren.

Also vielleicht zu viel von ASP.NET hier frage ich. Irgendwelche Ideen, wie diese Arbeit machen?

Danke,

Craig

War es hilfreich?

Lösung 3

Danke für das Feedback, aber es war eine ziemlich einfache Lösung.

Die JavaScript-Zeile sollte sein:

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

statt:

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

Ich habe nicht erkennen, dass das Attribut „name“ ist derjenige, der doPostBack Methode suchte.

Andere Tipps

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;}");

Werfen Sie einen Blick auf diese Frage Stackoverflow fand ich es sehr nützlich:

Schaltfläche Deaktivieren auf Formularübermittlung

Fügen Sie die Bestätigungslogik ... und Sie sollten eingestellt werden ...

ging ich einen Kopf und schrieb eine Erweiterungsmethode für Sie und mich auch:)

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());
}

gerade hinzugefügt Validierungsprüfmechanismus auch:)

Anstatt ein Postback durch Javascript tun, können Sie OnClientClick verwenden, um die gleiche Sache zu erreichen.

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

Oder wenn Sie mehrere Aktionen durch Javascript ausführen wollen, als einfach die Taste zu deaktivieren, können Sie so etwas wie dies sagen:

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

Sie müssen nur sicherstellen, dass du bist Formulierung in Form einer return-Anweisung, so dass, wenn Sie laufen nicht die ASP-Funktion wollen, wird letztlich die Aussage sagen: „return false;“

.

Javascript:

deleteButton.disabled = true;

C #:

deleteButton.Enabled = false;

Sie sollten wahrscheinlich auf die Schaltfläche auf der Server-Seite im deleteButton_Click Ereignisse deaktivieren (weil Sie einen Postback tun werden, so dass Sie die Seite neu).

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

Und in der Code-behind:

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

Es ist ein wenig seltsam, dass das Click-Ereignis nicht feuert. Ich hätte ahnen es auf die Schaltfläche zurückzuführen deaktiviert wird aber in der Regel, dass nur geschieht, wenn die Taste auf dem Server deaktiviert ist, nicht nur den Client. Obwohl es nicht die ideale Lösung in Ihrem Page_Load Funktion können Sie überprüfen, für eine Postbacks und / oder asynchroner Postbacks und das Ziel der Postbacks bestimmen (in diesem Fall seine Ihre Schaltfläche) und dann von dort eine Methode aufrufen. Sie können auch in Argumente übergeben die __doPostBack () Funktion.

Am Anfang war ich nicht sicher, ob Sie über das Client-Seite klicken Ereignis oder das Server-Seite Click-Ereignis sprechen. Ich glaube, Sie ausdrücklich, dass das Server-Seite Click-Ereignis angeben sollen, wird nicht ausgelöst.

Wie auch immer, versuchen <% @ Page EnableEventValidation = "false" %> auf der ASPX-Seite und sehen, ob es funktioniert (es wird standardmäßig auf true). Ich erinnere mich nicht die winzigsten dieses Attribut funktioniert, aber diese Funktion stellt sicher, dass das serverseitige Ereignis nur in berechtigten Fällen ausgelöst wird. Z.B. Lassen Sie uns sagen, dass Ihre Seite hatte XSS-Schwachstelle und ein Hacker injiziert JavaScript auf die Schaltfläche Löschen aufzurufen. Dieses Attribut hilft diese Angriffe zu verhindern.

$(":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;
    }
});

Ich beschloss, diese eine JS-Funktion zu machen, die von einem beliebigen Taste aufgerufen werden kann.

Hier ist ein Beispiel, das aber funktioniert, würde ich die JavaScript an einen anderen Ort wie eine bestehenden js-Datei oder den Kopf-Tag verschieben.

<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)" />
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top