代码之家  ›  专栏  ›  技术社区  ›  Neil T.

确认后删除并在成功时重定向

  •  2
  • Neil T.  · 技术社区  · 15 年前

    下面是我要找的行为:

    1. 用户从索引视图中选择一个记录,该视图将重定向到该记录的详细信息视图。
    2. 用户单击链接可删除当前显示的记录。
    3. 模式对话框要求确认删除。
    4. 用户按下确认按钮。
    5. 执行关联的控制器操作方法,该方法将删除记录。
    6. 用户将返回到索引视图,其中已删除的记录将不再显示。

    我使用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中,这种行为是相似的。

    1 回复  |  直到 8 年前
        1
  •  2
  •   ariel    15 年前

    $.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});
    }