Löschen Sie mit Bestätigung und Umleitung auf Erfolg

Hier ist das Verhalten ich bin auf der Suche nach:

  1. Benutzer wählt einen Datensatz aus einer index-Ansicht, die leitet, um den Datensatz in der Detailansicht.
  2. Benutzer klickt auf einen link zum löschen des aktuell angezeigten Datensatzes.
  3. Ein modales Dialogfeld fordert zur Bestätigung des löschen.
  4. Benutzer drückt den button "Bestätigen".
  5. Die zugehörige controller-action-Methode ausgeführt wird, die angeblich zum löschen des Datensatzes.
  6. Benutzer wieder auf die index-Ansicht, wo der gelöschte Datensatz nicht mehr angezeigt.

Ich bin mit ASP.NET MVC 1.0 als primärer Rahmen der dialog-Komponente von jQuery UI und LINQ-to-SQL-handle der Datenbank-Interaktion. Die Schritte eins bis vier führen in Ordnung. Schritt fünf, jedoch ruft den Datensatz, aber nicht löschen. Schritt sechs ausgeführt, doch wird der Datensatz weiterhin in der Liste angezeigt.

Hier ist der code für den link löschen:

<% if (Model.CanDelete())
   { %>
    <%= Html.ActionLink("Delete", "Delete", new { id = Model.Package_ID },
        new { onclick = string.Format("deletePackage({0}); return false;", Model.Package_ID) })%> |
<% } %>

Hier ist der code für das onclick-handler:

function deletePackage(packageID) {
    createDialogContent();  //The HTML for the dialog content is set in this method
    $.getJSON('/Spectrum/Package/DetailsJSON/' + packageID, function(json) {
        $('p.message').html('Delete <strong>' + json.Description + '</strong>?');
    });
    $('div.confirm').attr('title', 'Delete Package');
    $('div.confirm').dialog({
        draggable: false,
        modal: true,
        overlay: {
            backgroundColor: '#000',
            opacity: 0.5
        },
        resizable: false,
        buttons: {
            'Confirm': function() {
                $(this).dialog('destroy').remove();
                $.post('/Spectrum/Package/Delete/' + packageID);
                //The next line used to be: $.get('/Spectrum/Package/Index');
                window.location.href = '/Spectrum/Package/Index';
            },
            Cancel: function() {
                $(this).dialog('destroy').remove();
            }
        }
    });
}

Hier ist der code für das löschen von controller-Methode:

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Delete(int id)
{
    Package package = RepositoryManager.Package().GetPackage(id);
    PackageDeleteViewModel viewModel = new PackageDeleteViewModel
    {
        Package_ID = package.Package_ID
    };

    RepositoryManager.Package().PackageDelete(viewModel);  //see code below

    return new EmptyResult();
}

Schließlich, hier ist der repository-Methode für das löschen:

public void PackageDelete(PackageDeleteViewModel data)
{
    Package package = RepositoryManager.Package().GetPackage(data.Package_ID);

    if (package.BrokerageOrderPackages.Count == 0
        && package.ManagementOrderPackages.Count == 0
        && package.Seeds.Count == 0)
    {
        db.Packages.DeleteOnSubmit(package);  //This branch is being executed
        db.SubmitChanges();
    }
    else
    {
        throw new RulesException("Package cannot be deleted.", "PackageDelete");
    }
}

Ich glaube nicht, dass ich die Grenzen hier oder bekommen auch Lust. Ein Bereich, der Besorgnis: In der Confirm-button-handler von onclick-Methode, die erste version würde löschen des Datensatzes erfolgreich, aber nicht-redirect auf die Index-Ansicht. Mit der aktuellen version, das löschen schlägt im hintergrund fehl, aber die Weiterleitung erfolgt. Firefox/Firebug berichtet, 200 s für den Index BEKOMMEN, in beiden Situationen. Das Verhalten ist ähnlich in Firefox und IE.

  • Neil, ich versuche, code zu schreiben ähnlich wie deins, aber nicht mit viel Glück noch. Können Sie Ihre HTML-und code-Sie haben in der createDialogContent Methode? Danke.
InformationsquelleAutor Neil T. | 2009-12-19
Schreibe einen Kommentar