在Asp.Net MVC 2应用程序中使用jquery确认删除链接

时间:2010-08-22 21:36:13

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

我有一个包含删除链接的记录的表。基本上我在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;
        });
    });

删除actionlink:

<%: 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);返回false;而且我不确定“返回虚假”部分的作用。我尝试通过回调等方式根据我的需要修改它,并保留返回部分而不知道它的用途。

  2. 其次,action方法有HttpPost属性,但我也读过一些你可以使用删除动词的地方。你应该?那么RedirectToAction呢?这个目的最初是为了刷新页面,但是没有用,所以我将window.location.reload添加到了jQuery的回调中。有什么想法吗?

  3. Delete动作方法调用了几个辅助方法,因为它似乎与我用于数据的实体框架有关,如果它有关系依赖关系,我不能删除它。我必须首先删除关系,然后删除“用户”记录本身。这工作正常,但我认为可以删除一条记录,所有的关系都会被自动删除......?

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

  5. 非常感谢任何澄清!

3 个答案:

答案 0 :(得分:2)

  1. return false语句可用 与...相同的目的 在这种情况下e.preventDefault()。 通过返回false,JavaScript正在阻止 浏览器执行链接 默认点击处理程序。

  2. DELETE谓词适用于RESTful网站 服务,很可能不是什么 你想要在这种情况下因为 并非所有浏览器都完全实现它。 在此处详细了解这些内容:Creating a RESTful Web Service Using ASP.Net MVC

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

  4. 抓取工具无法执行此操作 激活你的删除链接 时尚,因为你已经指定 删除操作通过a发出 POST。如果删除是GET那么 这将是一个问题。不过,它还是 不直接保持链接是不明智的 修改前面的内容 不需要的页面 身份验证最能成为人类 肯定会利用这个过程。

答案 1 :(得分:1)

你去了,完整的代码:

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点击处理程序结束时返回false时,浏览器会执行javascript但不会跟踪该链接,因为返回false。

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

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

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

答案 2 :(得分:1)

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

enter image description here