刷新局部视图后防伪令牌不存在

Antiforgery token not present after refreshing partial view

我遇到了 POST 上不存在防伪令牌的问题,但这只是在我通过局部视图刷新显示的数据之后,在刷新数据之前令牌是存在且有效。我已尝试详细概述我的问题,但如果一些代码会更有帮助,我很乐意提供一些?

我有一个包含 2 table 的页面。第一个table(摘要视图table)是第二个table中显示的项目的摘要,点击摘要视图中的行会刷新第二个[=43]中的数据=](详细视图 table)。摘要视图中的数据使用foreach循环直接呈现在页面上,但详细视图中的数据通过部分视图呈现,以允许我刷新数据而不刷新整个页面。

在详细视图中 table 可以通过进入编辑模式更新每行中的某些值,然后通过单击按钮触发表单提交事件。这在初始页面加载时工作正常,我可以将新行添加到详细视图并修改新行或现有行而不会出现任何问题。但是,一旦我通过单击摘要视图行刷新详细视图中的数据并尝试更新任何值,我就会收到 _The required anti-forgery form field "__RequestVerificationToken" is not present.

在检查页面源时,存在防伪标记,但是每次刷新局部视图时值都会发生变化,即使我加载了同一组数据也是如此。如果我从原始页面复制令牌(在我重新加载局部视图之前)并加载相同的详细信息集,我可以修改页面源并将新令牌替换为以前的令牌然后我就能够成功 POST表格;主要是...

检查 __RequestVerificationToken cookie 显示在刷新详细视图之间 cookie 值没有变化,因此问题似乎出在局部视图中的标记值上,但这究竟在哪里以及如何将值与 cookie 令牌重新同步,我不知道。

有没有人experienced/resolved以前遇到过类似的问题?我找到了一个与我的问题类似的 post,但没有任何回应,它是在 2016 年 post 编辑的。我已经联系了 OP,但我不确定一个及时的回应,所以我希望其他人之前已经处理过部分视图中的防伪令牌,并且可以为我指明正确的方向。

以防万一,我使用表单操作来提交数据,而不是 JavaScript/ajax。理想情况下,我想坚持这一点,但如果这是问题所在,那么我改变我的实现没有问题。

如果一些代码可以帮助更多地理解问题,请告诉我,我很乐意 post 一些。

在此先感谢您对此的任何帮助。

[HttpGet]
public  ActionResult  ShowTimesheet(long  timesheetId)
{
    return  PartialView("_TimeEntriesPartial",
    _timesheetService.GetById(timesheetId).TimeEntries);
}

查看

<tbody >
    @Html.Partial("_TimeEntriesPartial", Model.Timesheet.TimeEntries);
</tbody>

局部视图

@model IEnumerable<ProjectTime.Model.Entities.TimeEntry>
@foreach (var  TimeEntry  in  Model)
{
    using (Html.BeginForm("UpdateTimeEntry", "Home", FormMethod.Post, new { id  =  TimeEntry.Id }))
    {
    @Html.AntiForgeryToken()
    <tr>
        columns...
        <td>Controls for switching mode and submitting item</td>
    </tr>
    }
}

回答我自己的问题,问题的根本原因是因为我将表单注入 table,这是无效的 Html。当我在 table 之外执行此操作时,它会起作用。