Удалить с подтверждением и перенаправить в случае успеха - PullRequest
2 голосов
/ 20 декабря 2009

Вот поведение, которое я ищу:

  1. Пользователь выбирает запись в индексном представлении, которое перенаправляет в подробный вид этой записи.
  2. Пользователь щелкает ссылку, чтобы удалить отображаемую в данный момент запись.
  3. Модальное диалоговое окно запрашивает подтверждение удаления.
  4. Пользователь нажимает кнопку подтверждения.
  5. Выполняется связанный метод действия контроллера, который должен удалить запись.
  6. Пользователь возвращается в индексное представление, где удаленная запись больше не отображается.

Я использую ASP.NET MVC 1.0 в качестве основного каркаса, компонент диалога из пользовательского интерфейса jQuery и LINQ-to-SQL для взаимодействия с базой данных. Шаги с первого по четвертый выполняются просто отлично. Шаг пятый, однако, извлекает запись, но не удаляет ее. Шаг шестой выполняется, но запись по-прежнему отображается в списке.

Вот код для ссылки для удаления:

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

Вот код для обработчика onclick:

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

Вот код для метода удаления контроллера:

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

Наконец, вот метод репозитория для удаления:

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

Не думаю, что я запихиваю сюда конверт или становлюсь слишком модным. Одна проблемная область: в обработчике кнопки «Подтверждение» метода onclick первая версия успешно удалит запись, но не перенаправит ее в представление «Индекс». В текущей версии удаление завершается неудачно, но происходит перенаправление. Firefox / Firebug сообщили о 200-х годах для Index GET в обеих ситуациях. Поведение схоже как в Firefox, так и в IE.

1 Ответ

2 голосов
/ 02 января 2010

$. Post - это асинхронный ajax-запрос, если вы перезагрузите страницу, вызов будет отменен. Вам следует перезагрузить страницу по ее параметру функции обратного вызова:

$.post('/Spectrum/Package/Delete/' + packageID, 
       null, 
       function(json){ 
            if (json.success) {
                window.location.href = '/Spectrum/Package/Index';
            } else {
                // jquery dialog call or
                alert(json.errorMessage);
            }
       },
       'json');

И код контроллера:

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Delete(int id)
{
   try {
      // Validation and deletion code
   } catch exception ex {
      return Json(new {errorMessage = ex.Message, success = false});
   }
   return Json(new {success = true});
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...