【问题标题】:Delete link with jquery confirm in Asp.Net MVC 2 application在 Asp.Net MVC 2 应用程序中使用 jquery 确认删除链接
【发布时间】:2011-04-11 22:48:20
【问题描述】:

我有一个包含删除链接的记录的表。基本上,我遵循了 MVC 中那部分的 NerdDinner 教程。但是我不想有确认视图,我宁愿有一个确认对话框,然后如果确认让 HttPost 操作方法直接删除记录。

我有一些工作,但对 MVC 和 jQuery 都是新手,我不确定我是否做得对。

这是 jQuery:

    $(function () {
        $('.delete').click(function () {
            var answer = confirm('Do you want to delete this record?');
            if (answer) {
                $.post(this.href, function () {
                    window.location.reload(); //Callback
                });
                return false;
            }
            return false;
        });
    });

以及删除操作链接:

<%: Html.ActionLink("Delete", "Delete", new { id = user.UserID }, new { @class = "delete" })%>

最后,删除操作方法:

    [HttpPost]
    public ActionResult Delete(int id)
    {
        _db = new UsersEntities();
        try
        {
            //First delete the dependency relationship:
            DeleteUserVisits(id);
            //Then delete the user object itself:
            DeleteUser(id);
        }
        catch (Exception)
        {
            return View("NotFound");
        }

        return RedirectToAction("Index");
    }

现在,我有几个问题:

  1. 我在互联网上找到了使链接 POST 而不是 GET 的函数:`$.post(this.href);返回假;而且我不确定“return false”部分的作用。我尝试通过回调等方式根据需要对其进行修改,并在不知道它的用途的情况下保留了返回部分。

  2. 其次,action 方法具有 HttpPost 属性,但我还在某处读到了可以使用删除动词的内容。你应该?那么 RedirectToAction 呢?这样做的目的最初是为了刷新页面,但没有奏效,所以我在 jQuery 的回调中添加了 window.location.reload 。有什么想法吗?

  3. Delete 操作方法调用了几个辅助方法,因为在我用于数据的实体框架中,如果记录具有关系依赖项,我不能只删除它。我必须先删除关系,然后再删除“用户”记录本身。这很好用,但我原以为可以只删除一条记录,所有关系都会自动删除...?

  4. 我知道您不应该直接删除链接,因为爬虫等可能会意外删除记录。但是对于 jQuery,这有什么安全问题吗?当中间有 jQuery 检查时,爬虫无法做到这一点,对吧?

任何澄清将不胜感激!

【问题讨论】:

    标签: asp.net jquery entity-framework asp.net-mvc-2


    【解决方案1】:
    1. return false 语句服务 目的相同 e.preventDefault() 在这种情况下。 通过返回错误的 JavaScript 可以防止 浏览器从执行链接的 默认点击处理程序。

    2. DELETE 动词用于 RESTful Web 服务,很可能不是什么 你想在这种情况下,因为 并非所有浏览器都完全实现它。 在此处阅读有关它们的更多信息:Creating a RESTful Web Service Using ASP.Net MVC

    3. child 的删除规则 实体依赖于实体 OnDelete/OnUpdate 规则 上下文定义以及 外键约束 数据库。你可以learn more about foreign key constraints here

    4. 爬虫将无法 在此激活您的删除链接 时尚,因为你已经指定 删除操作通过 a 发出 邮政。如果删除是 GET 则 这将是一个问题。尽管如此,还是 直接保留链接是不明智的 在正面修改您的内容 不需要的页面 作为人类的身份验证最 肯定会利用这个过程。

    【讨论】:

    • 谢谢!但是关于删除规则:如何设置它们?谷歌搜索我知道我也应该在数据库中“设置级联删除”。但我找不到任何关于如何做到这一点的信息。我所知道的是“强制外键约束”在关系中设置为是。
    • 这将取决于您的数据库引擎,但这里有一些如何定义外键约束的示例:1keydata.com/sql/sql-foreign-key.html
    【解决方案2】:

    你去,有完整的代码:

    http://haacked.com/archive/2009/01/30/delete-link-with-downlevel-support.aspx

    或者只是 html 助手:

    public static string DeleteLink(this HtmlHelper html, string linkText, string routeName, object routeValues) {
        var urlHelper = new UrlHelper(html.ViewContext.RequestContext);
        string url = urlHelper.RouteUrl(routeName, routeValues);
    
        string format = @"<form method=""post"" action=""{0}"" class=""delete-link"">
        <input type=""submit"" value=""{1}"" />
        {2}
        </form>";
    
        string form = string.Format(format, html.AttributeEncode(url), html.AttributeEncode(linkText), html.AntiForgeryToken());
    
        return form + html.RouteLink(linkText, routeName, routeValues, new { @class = "delete-link", style = "display:none;" });
    }
    

    对于您的问题:

    1. 当您在链接上的 javascript 点击处理程序末尾执行 return false 时,浏览器会执行 javascript 但不会跟随链接,因为 return false。

    2. 为了(最大)跨浏览器兼容性,您不应使用 DELETE 动词。

    3. 我对EF了解不够,但是它不提供级联删除的映射配置吗?

    4. HTTP GET 只能用于获取信息,例如,为搜索提供参数。爬虫通常不关心javascript,所以他们会盲目地跟随你的链接。如果是http://mysite/delete/everything,那么,如果您的控制器操作上没有 [HttpPost],对您不利

    【讨论】:

      【解决方案3】:

      如果你也想把 jQuery 对话框扔到派对上,这个Ricardo Covo post 做得很好

      【讨论】:

        猜你喜欢
        • 2014-03-23
        • 2022-08-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多