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