下面是我要找的行为:
-
用户从索引视图中选择一个记录,该视图将重定向到该记录的详细信息视图。
-
用户单击链接可删除当前显示的记录。
-
模式对话框要求确认删除。
-
用户按下确认按钮。
-
执行关联的控制器操作方法,该方法将删除记录。
-
用户将返回到索引视图,其中已删除的记录将不再显示。
我使用asp.net mvc 1.0作为主框架,jquery ui中的对话框组件,以及linq to sql来处理数据库交互。第一步到第四步执行得很好。但是,步骤5检索记录,但不删除它。执行步骤6,但记录仍显示在列表中。
以下是删除链接的代码:
<% 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();
}
}
});
}
下面是delete controller方法的代码:
[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方法的confirm按钮处理程序中,第一个版本将成功删除记录,但不会重定向到index视图。对于当前版本,删除将自动失败,但会发生重定向。在这两种情况下,firefox/firebug都报告索引get为200。在firefox和ie中,这种行为是相似的。