我只是想在我的Action
中启发我的javascript和Controller
的行为。目前,我有以下代码。
Index.chtml
@model IEnumerable<WebSensoryMvc.Models.SessionData>
@{
ViewBag.Title = "Index";
Layout = "~/Views/Shared/_Layout.cshtml";
}
<h2>Index</h2>
<p>
@Html.ActionLink("Create New", "Create")
</p>
<div class="container">
<div class="col-md-8 col-md-offset-2">
<table class="table">
<tr>
<th>
@Html.DisplayNameFor(model => model.SessionName)
</th>
<th>
@Html.DisplayNameFor(model => model.EvaluationDate)
</th>
<th>
@Html.DisplayNameFor(model => model.SessionNumber)
</th>
<th>
@Html.DisplayNameFor(model => model.Active)
</th>
<th></th>
</tr>
@foreach (var item in Model)
{
<tr>
<td>
@Html.DisplayFor(modelItem => item.SessionName)
</td>
<td>
@Html.DisplayFor(modelItem => item.EvaluationDate)
</td>
<td>
@Html.DisplayFor(modelItem => item.SessionNumber)
</td>
<td>
@Html.DisplayFor(modelItem => item.Active)
</td>
<td>
<a href="#" id=@item.SessionID data-toggle="modal" data-target="#deleteModal" title="Edit"><span class="glyphicon glyphicon-edit"></span></a>
<a href="@Url.Action("Details", "SessionData", new { id=item.SessionID })" data-toggle="tooltip" title="Details"><span class="glyphicon glyphicon-align-justify"></span></a>
<a href="#" onclick="deleteSession(@item.SessionID)" id="btnDelete" data-toggle="modal" data-target="#deleteModal" title="Delete"><span class="glyphicon glyphicon-trash"></span></a>
</td>
</tr>
}
</table>
</div>
</div>
<script type="text/javascript" language="javascript">
$(document).ready(function(){
$('[data-toggle="tooltip"]').tooltip();
});
function deleteSession(sessionId) {
bootbox.confirm("Are you sure you want to delete Session Id " + sessionId + "?", function (result) {
var token = $('input[name="__RequestVerificationToken"]').val();
$.ajax({
url: "@Url.Action("Delete", "SessionData")",
type: 'POST',
data: { id: sessionId, __RequestVerificationToken: token },
success: function (data) {
console.log(data);
},
error: function (data) {
console.log(data);
}
});
});
}
</script>
Index.chtml下的JavaScript
<script type="text/javascript" language="javascript">
function deleteSession(sessionId) {
bootbox.confirm("Are you sure you want to delete Session Id " + sessionId + "?", function (result) {
$.ajax({
url: "@Url.Action("Delete", "SessionData")",
type: 'POST',
data: { id: sessionId },
success: function (data) {
console.log(data);
},
error: function (data) {
console.log(data);
}
});
});
}
</script>
SessionDataController
public ActionResult Delete(int? id)
{
if (id == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
SessionData sessionData = db.SessionDatas.Find(id);
if (sessionData == null)
{
return HttpNotFound();
}
return View(sessionData);
}
[HttpPost, ActionName("Delete")]
[ValidateAntiForgeryToken]
public ActionResult DeleteConfirmed(int id)
{
SessionData sessionData = db.SessionDatas.Find(id);
db.SessionDatas.Remove(sessionData);
db.SaveChanges();
return RedirectToAction("Index");
}
我在这里要做的是使用jQuery
删除记录并跳过MVC生成的方法,当您单击“删除”链接时,它会先将您重定向到另一个View,就像之前的确认一样将完全删除数据库中的记录。
使用jQuery单击删除链接时遇到的奇怪行为是,当ValidateAntiForgeryToken
操作中存在数据注释DeleteConfirm
时,我的javascript和操作不会被执行或触发。但是,当我删除ValidateAntiForgeryToken
时,它会执行我的javascript和操作。谁可以开导我这个?
TIA
答案 0 :(得分:0)
你试过搜索吗?这个问题有很多答案......
防止跨站点请求伪造是预期的行为。您需要包含来自;
的值@Html.AntiForgeryToken()
在你的电话中避免这种情况。 也许读一读;
答案 1 :(得分:0)
[ValidateAntiForgeryToken]
,用于跨域安全。
您还必须在html中添加@Html.AntiForgeryToken()
并在AJAX调用中传递令牌参数值,以便成功执行[ValidateAntiForgeryToken]
属性的操作。