【问题标题】:ASP.Net MVC 5 Ajax request on Edit page Error __RequestVerificationToken is not present编辑页面上的 ASP.Net MVC 5 Ajax 请求错误 __RequestVerificationToken 不存在
【发布时间】:2015-02-01 17:33:28
【问题描述】:

我使用 jQuery Ajax 和 ASP.Net MVC 创建了一个级联下拉菜单 我已经设置了我的 ajax 请求 OnChange of dropdown 这是我的代码:

 @Html.DropDownList("Agency_Id", null, htmlAttributes: new { @class = "form-control", @onchange = "bring_projects(this.value,'bring_projects_by_agency','Project_Id')" })

项目下拉:

  @Html.DropDownList("Project_Id", null, htmlAttributes: new { @class="form-control"})

这是我的脚本:

function bring_projects(id, funcs, divname) {
var ajax_image = "<img src='./Content/loading.GIF' >";
$('#' + divname).html(ajax_image);
var params = "&agency_id=" + id;
$.ajax({
    url: funcs,
    type: "POST",
    data: params,
})
.done(function (r) {
    $('#' + divname).html(r);
});

}

它给出了以下错误:

Server Error in '/' Application.

The required anti-forgery form field "__RequestVerificationToken" is not present.

注意: 我没有提交表单,我只是在我的编辑页面中执行 ajax 请求 OnChange of DropDown。

【问题讨论】:

  • 如果您查看页面生成的 HTML 源代码,您会看到自动生成的表单中有一个隐藏的输入。您需要将其包含在您的 AJAX 请求中,因为它用于确保请求实体是合法的。

标签: javascript jquery asp.net ajax asp.net-mvc


【解决方案1】:

防伪令牌是一种防止Cross-Site Request forgery 攻击的方法。当使用默认的 MVC 方法时,它有两个部分:

  • 您认为防伪令牌。它通常通过使用 html helper Html.AntiForgeryToken 来使用。这会导致在表单上创建隐藏输入字段 __RequestVerificationToken
  • 属性ValidateAntiForgeryToken 应用于您的控制器或操作方法。

在您的情况下,错误表明您的方法中有ValidateAntiForgeryToken,但表单方法没有提交第二部分 - 字段__RequestVerificationToken。为了解决这个问题,您应该在 post 方法中添加第二个参数:

var params = "&agency_id=" + id;
params += params + "&__RequestVerificationToken=" + $('input[name=__RequestVerificationToken]').val();
$.ajax({
    url: funcs,
    type: "POST",
    data: params,
})

您可以在blog post 中阅读有关防伪令牌的更多信息

【讨论】:

    【解决方案2】:

    这是一个如何工作的示例。

    控制器:

    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            return View();
        }
    
        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Index(string someValue)
        {
            return Json(new { someValue = someValue });
        }
    }
    

    查看:

    @using (Html.BeginForm(null, null, FormMethod.Post, new { id = "__AjaxAntiForgeryForm" }))
    {
        @Html.AntiForgeryToken()
    }
    
    <div id="myDiv" data-url="@Url.Action("Index", "Home")">
        Click me to send an AJAX request to a controller action
        decorated with the [ValidateAntiForgeryToken] attribute
    </div>
    
    <script type="text/javascript">
        $('#myDiv').submit(function () {
            var form = $('#__AjaxAntiForgeryForm');
            var token = $('input[name="__RequestVerificationToken"]', form).val();
            $.ajax({
                url: $(this).data('url'),
                type: 'POST',
                data: { 
                    __RequestVerificationToken: token, 
                    someValue: 'some value' 
                },
                success: function (result) {
                    alert(result.someValue);
                }
            });
            return false;
        });
    </script>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-07
      • 2017-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-27
      • 2019-02-13
      • 2015-09-07
      相关资源
      最近更新 更多