Вот поведение, которое я ищу:
- Пользователь выбирает запись в индексном представлении, которое перенаправляет в подробный вид этой записи.
- Пользователь щелкает ссылку, чтобы удалить отображаемую в данный момент запись.
- Модальное диалоговое окно запрашивает подтверждение удаления.
- Пользователь нажимает кнопку подтверждения.
- Выполняется связанный метод действия контроллера, который должен удалить запись.
- Пользователь возвращается в индексное представление, где удаленная запись больше не отображается.
Я использую 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.