我有一个包含删除链接的记录的表。基本上我在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");
}
现在,我有几个问题:
我找到了在互联网上建立链接POST而不是GET的功能:`$ .post(this.href);返回false;而且我不确定“返回虚假”部分的作用。我尝试通过回调等方式根据我的需要修改它,并保留返回部分而不知道它的用途。
其次,action方法有HttpPost属性,但我也读过一些你可以使用删除动词的地方。你应该?那么RedirectToAction呢?这个目的最初是为了刷新页面,但是没有用,所以我将window.location.reload添加到了jQuery的回调中。有什么想法吗?
Delete动作方法调用了几个辅助方法,因为它似乎与我用于数据的实体框架有关,如果它有关系依赖关系,我不能删除它。我必须首先删除关系,然后删除“用户”记录本身。这工作正常,但我认为可以删除一条记录,所有的关系都会被自动删除......?
我知道您不应该直接删除链接,因为抓取工具等可能会意外删除记录。但是使用jQuery,这有什么安全问题吗?当中间有jQuery检查时,爬虫无法做到这一点,对吗?
非常感谢任何澄清!
答案 0 :(得分:2)
return false
语句可用
与...相同的目的
在这种情况下e.preventDefault()
。
通过返回false,JavaScript正在阻止
浏览器执行链接
默认点击处理程序。
DELETE谓词适用于RESTful网站 服务,很可能不是什么 你想要在这种情况下因为 并非所有浏览器都完全实现它。 在此处详细了解这些内容:Creating a RESTful Web Service Using ASP.Net MVC
儿童的删除规则 实体依赖于实体 OnDelete / OnUpdate中的规则 上下文定义以及 外键约束 数据库。你可以learn more about foreign key constraints here。
抓取工具无法执行此操作 激活你的删除链接 时尚,因为你已经指定 删除操作通过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;" });
}
对于你的问题:
当您在链接上的javascript点击处理程序结束时返回false时,浏览器会执行javascript但不会跟踪该链接,因为返回false。
对于(最大)跨浏览器兼容性,您不应使用DELETE动词。
我不太了解EF,但它不提供级联删除的映射配置吗?
HTTP GET只应用于获取信息,例如,为搜索提供参数。爬虫通常不关心javascript,因此他们会盲目跟踪你的链接。如果它是http://mysite/delete/everything,那么,对你不好,如果你没有控制器动作上的[HttpPost]
答案 2 :(得分:1)
如果你还想把jQuery对话框扔到派对上,这个Ricardo Covo post做得很好