【问题标题】:Trigger update action from checkboxfor with AnitForgeryToken from ajax call使用 AntiForgeryToken 从 checkboxfor 触发更新操作以进行 ajax 调用
【发布时间】:2018-08-13 21:07:31
【问题描述】:

我有一个从实体中引入所有数据的视图:

@model MyApplication.Application.TableModel<Entities.FPDrinkingWater>
@{
Layout = null;

var insertionMode = InsertionMode.Replace;
var fail = "displayFailure";
var target = "UnverifiedDrinkingWatersContent";
var ajax = "UnverifiedDrinkingWaterLogLoader";
var verify = Html.UserHasClaim("FP/DrinkingWater/VerifyDrinkingWater");
var action = "VerifyDrinkingWater";
string form = action + "Form";
}

<br />

@if (Model != null && Model.Alert != null && Model.Alert.Message != null)
{
@Html.Alert(Model.Alert)
}

@MyHelper.Loader(ajax)

<div class="form-group">
<table id="UnverifiedDrinkingWaterTable" class="table table-hover">
    <thead>
        <tr>
            <th>@Html.LabelFor(m => m.Data.FirstOrDefault().SID)</th>
            <th>@Html.LabelFor(m => m.Data.FirstOrDefault().Location)</th>
            <th>@Html.LabelFor(m => m.Data.FirstOrDefault().Replicate)</th>
            <th>@Html.LabelFor(m => m.Data.FirstOrDefault().CollectionDate) 
   </th>
            <th>@Html.LabelFor(m => m.Data.FirstOrDefault().CollectionTime) 
   </th>
            <th>@Html.LabelFor(m => m.Data.FirstOrDefault().Collectors)</th>
            <th>@Html.LabelFor(m => m.Data.FirstOrDefault().Clorinated)</th>
            <th>@Html.LabelFor(m => m.Data.FirstOrDefault().Comments)</th>
            <th>@Html.LabelFor(m => m.Data.FirstOrDefault().Verified)</th>
        </tr>
    </thead>
    <tbody>

        @for (int i = 0; i < Model.Data.Count(); i++)
        {
            using (Ajax.BeginForm(actionName: action, routeValues: null,

    htmlAttributes: new { id = form, @class = "form-horizontal" }, 
ajaxOptions: 
new AjaxOptions
            {
                InsertionMode = InsertionMode.Replace,
                UpdateTargetId = target,
                OnSuccess = "success",
                LoadingElementId = ajax
            }))
            {
                @Html.AntiForgeryToken()

                <tr>
                    <td>@Html.DisplayFor(m => m.Data[i].SID)</td>
                    <td>@Html.DisplayFor(m => m.Data[i].Location)</td>
                    <td>@Html.DisplayFor(m => m.Data[i].Replicate)</td>
                    <td>@Html.DisplayFor(m => m.Data[i].CollectionDate)</td>
                    <td>@Html.DisplayFor(m => m.Data[i].CollectionTime)</td>
                    <td>@Html.DisplayFor(m => m.Data[i].Collectors)</td>
                    <td>@Html.DisplayFor(m => m.Data[i].Clorinated)</td>
                    <td>@Html.DisplayFor(m => m.Data[i].Comments)</td>
                    <td>@Html.CheckBoxFor(v => v.Data[i].Verified, new { 
data_url = Url.Action("VerifyDrinkingWater", "DrinkingWater"), id = 
"checkboxid" }) </td>
                </tr>
           }
        }

    </tbody>
</table>
</div>

<hr />

        @if (Model.Data.Count > 0)
        {
            <script>
                $(document).ready(function () {
                    makeDataTable('UnverifiedDrinkingWaterTable');
                });

                (function () {
                    $('#checkboxid').change(function () {
                        var data = {};
                        data[$(this).attr('name')] = $(this).is('checked');

                        $.ajax({
                            url: $(this).data('url'),
                            type: 'POST',
                            data: data,
                            success: function (result) {
                            }

                        });
                    });

                    });

            </script>
        }

我的目标是通过选中“已验证”复选框来更新表中显示的记录上的 3 个字段。我跟着This Link 在checkboxfor 上启用了点击事件。但是,我收到一条错误消息,声称 The required anti-forgery form field __RequestVerificationToken is not present.。这是我收到的唯一错误。

所以我的问题是,如何结合 Ajax 调用创建的 AntiForgeryToken AND 同时传递复选框的选中状态,然后将其传递给控制器​​?现在它甚至没有触摸控制器,只是给了我 AntiForgeryToken 错误。

【问题讨论】:

  • 您是否费心阅读我在您的previous question 中提供给您的链接。您的代码中有多个错误(包括无效的 html - &lt;form&gt; 不能是 &lt;tbody&gt; 的子级,拥有 @Ajax.BeginForm() 然后使用 $.ajax() 是没有意义的,它是一个糟糕的 UI 提交表单时你点击一个复选框,你有重复的id属性,这也是无效的html等)
  • 对于我对这个问题的无知感到抱歉。我知道这种观点有很多错误的地方。我正在尽我最大的努力学习。
  • 是一种更好的格式,可以选择所有要验证的复选框,然后将集合传递给控制器​​,在控制器中循环遍历每个复选框 foreach 测试验证字段是否为真或false 然后相应更新?
  • 是的。要生成用于绑定到集合的 html,请参阅 this answer - 您需要为 ID 属性提供隐藏输入,以及 @Html.CheckBoxFor(m =&gt; m.Data[i].Verified)
  • 感谢您的建议和耐心。我会查看您发布的所有链接。

标签: javascript c# jquery ajax asp.net-mvc-5


【解决方案1】:

只需使用

获取令牌
var token = $('input[name="__RequestVerificationToken"]').val();

并把它放在这样的数据中

var data = { 
__RequestVerificationToken: token 
}

请注意您多次渲染 AntiForgeryToken,因此请修改您的代码以获取每个表单的正确 AntiForgeryToke

【讨论】:

  • 甜蜜,这比我之前搜索的要简单。现在我有一个新问题,当它到达控制器时,一切都是空的......但更重要的是它到达了控制器!谢谢!
猜你喜欢
  • 2011-12-08
  • 2013-02-26
  • 1970-01-01
  • 2014-04-08
  • 1970-01-01
  • 2012-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多