【问题标题】:MVC AntiforgeryToken - Limit?MVC AntiforgeryToken - 限制?
【发布时间】:2016-03-08 10:29:14
【问题描述】:

我有一个通过 Firefox 显示正常但在 IE11 上显示的视图。

它使用数据表,其中 2 列有按钮来切换显示的某些数据的状态。

这些列非常相似,一个是这样的......

        @{
            <td style="width: 18%">
                @if ((ViewBag.UserIsAdmin == "1") && ("AV".Contains(Model[ix].Status[0])) )
                {
                    <span class="hidden_span">@Html.DisplayFor(modelItem => Model[ix].StockId)</span>
                    string voidItemButtonCaption = String.Format("{0} {1}", ((Model[ix].Status[0] == 'A') ? "Void Item" : "Un-Void Item"), Model[ix].StockId);
                    using (Html.BeginForm("VoidStockItem", "Stock", new { stockId = Model[ix].StockId, categoryId = Model[ix].CategoryId, bAvailableOnly = availableOnly }, FormMethod.Post, null))
                    {
                        @Html.AntiForgeryToken()
                        @Html.Raw(string.Format("<input type=\"submit\" value=\"{0}\" name=\"VoidStockItem\" class=\"btn btn-default smaller_btn_btn_default\" />", voidItemButtonCaption));
                    }
                }
                else
                {
                    @Html.DisplayFor(modelItem => Model[ix].StockId)
                }
            </td>
        } 

我发现如果我的模型包含超过 115 个项目,那么在 IE 中,视图将不会显示,它只会显示“无法显示此页面”。 在 IE 中使用 F12 也没有多大帮助.... "DOM7011: 此页面上的代码禁用了前后缓存。更多信息请参阅:http://go.microsoft.com/fwlink/?LinkID=291337"

经过大量拉扯后,我发现如果我移除防伪标记,页面会正确加载。显然我不能将其作为解决方案,但我想这至少是一个线索。

因此,我在一个视图中似乎仅限于大约 230 个防伪令牌。 有问题的视图列出了股票并允许用户取消特定的项目,所以它与这个世界无关。

所以我的问题是……

  1. 视图上的防伪令牌数量是否有限制?
  2. 有没有办法只在点击其中一个提交按钮时才插入一个?
  3. 我做错了什么?
  4. 谁能指出我正确的方向来解决这个问题?

非常感谢任何帮助。

【问题讨论】:

  • 想也许我应该只使用一个按钮并将 AJAX 调用挂钩到其点击事件上的 POST 操作...听起来可行吗?
  • 我最终是通过 AJAX 完成的。

标签: model-view-controller internet-explorer-11 antiforgerytoken


【解决方案1】:

我最终是通过 AJAX 完成的。

在从 _Layout 获取 AntiForgeryToken 时运行良好。

//There isn't an antiforgerttoken on this page but there is one in the _~\shared\layout so it picks that up
params["__RequestVerificationToken"] = $('[name=__RequestVerificationToken]').val();
//Set the generic params
params["categoryId"] = catId;
params["denom"] = thisdenom;
params["bAvailableOnly"] = bAvail;

if (bIsBatch) {
    url = "@Url.Action("VoidStockBatch", "Stock")";
    params["stockBatchId"] = itemId;          
} else {
    url = "@Url.Action("VoidStockItem", "Stock")";
    params["stockId"] = itemId;
}

$.ajax({
    url: url,
    type: 'POST',
    cache: false,
    data: params,
    success: ...........

【讨论】:

    猜你喜欢
    • 2018-06-11
    • 1970-01-01
    • 2010-11-23
    • 1970-01-01
    • 2011-10-09
    • 2013-07-22
    • 2013-02-05
    • 1970-01-01
    • 2011-09-06
    相关资源
    最近更新 更多