【问题标题】:ASP.NET MVC 5 Deleting Row in databaseASP.NET MVC 5 删除数据库中的行
【发布时间】:2016-08-17 09:12:21
【问题描述】:

我只是想在我的Controller 中启发我的javascript 和Action 的行为。目前,我有以下代码。

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 生成的方法,当您单击删除链接时,它会首先将您重定向到另一个视图,就像确认一样,然后它才会完全删除数据库中的记录。

我在使用 jQuery 单击删除链接时遇到的奇怪行为是,当 DeleteConfirm 操作中存在数据注释 ValidateAntiForgeryToken 时,我的 javascript 和操作没有被执行或触发。但是,当我删除 ValidateAntiForgeryToken 时,它会执行我的 javascript 和操作。任何人都可以启发我吗?

TIA

【问题讨论】:

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


    【解决方案1】:

    [ValidateAntiForgeryToken],用于跨域安全。

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

    更多详情请查看:https://stackoverflow.com/a/38893962/6606630

    【讨论】:

    • 嗨桑迪普帕特尔,所以你建议我将我的 chtml 包装在一个表格中? @using (Html.BeginForm()) { @Html.AntiForgeryToken()
      ...
      }
    【解决方案2】:

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

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

    @Html.AntiForgeryToken()
    

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-07-21
      • 2017-12-15
      • 1970-01-01
      • 2021-05-29
      • 2015-04-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多