ASP.NET MVC 5删除数据库中的行

时间:2016-08-17 09:12:21

标签: javascript jquery asp.net ajax asp.net-mvc

我只是想在我的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

2 个答案:

答案 0 :(得分:0)

你试过搜索吗?这个问题有很多答案......

防止跨站点请求伪造是预期的行为。您需要包含来自;

的值
@Html.AntiForgeryToken()

在你的电话中避免这种情况。 也许读一读;

http://blog.stevensanderson.com/2008/09/01/prevent-cross-site-request-forgery-csrf-using-aspnet-mvcs-antiforgerytoken-helper/

答案 1 :(得分:0)

[ValidateAntiForgeryToken],用于跨域安全。

您还必须在html中添加@Html.AntiForgeryToken()并在AJAX调用中传递令牌参数值,以便成功执行[ValidateAntiForgeryToken]属性的操作。

请查看详细信息:https://stackoverflow.com/a/38893962/6606630