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

时间:2018-12-04 16:37:26

标签: asp.net .net asp.net-mvc antiforgerytoken

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

我有一个包含2张桌子的页面。第一个表(摘要视图表)是第二个表中显示的项目的摘要,单击摘要视图中的行将刷新第二个表(详细信息视图表)中的数据。摘要视图中的数据是使用foreach循环直接显示在页面上的,而详细视图中的数据是通过局部视图显示的,这使我无需刷新整个页面即可刷新数据。

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

在检查页面源代码时,存在防伪令牌,但是即使我加载相同的数据集,该值也会在每次刷新部分视图时更改。如果我从原始页面复制令牌(在重新加载部分视图之前)并加载相同的详细信息集,则可以修改页面源并将新令牌替换为先前的令牌,然后我就可以成功地发布形成;大多...

检查__RequestVerificationToken cookie在刷新详细信息视图之间没有显示cookie值的变化,因此问题似乎在于局部视图中的令牌值,但是确切的位置以及如何重新同步cookie令牌的价值,我不知道。

有人曾经经历过/解决过类似的问题吗?我发现有一个帖子与我的问题相似,但没有回复,并且该帖子已于2016年发布。我已经联系了OP,但是我对及时的回复不自信,所以我希望之前有人在局部视图中处理过防伪令牌,并且可以为我指明正确的方向。

如果有问题,我正在使用表单操作来提交数据,而不是JavaScript / ajax。理想情况下,我想坚持这一点,但是如果这是问题所在,那么我就可以毫无疑问地更改自己的实现。

如果某些代码可以帮助您进一步了解该问题,请告诉我,我们很乐意发布一些代码。

在此先感谢您的协助。

[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>
    }
}

1 个答案:

答案 0 :(得分:0)

要回答我自己的问题,问题的根本原因是因为我正在向表格中插入表格,这不是有效的HTML。当我在表外执行此操作时,它将起作用。