title: anti-forgery form field "__RequestVerificationToken" is not present when using jQuery Ajax and the Html.AntiForgeryToken()
body: <p>I implemented the Razor equivalent for the solution described in the accepted answer for this Question:  <em><a href="https://stackoverflow.com/questions/4074199/jquery-ajax-calls-and-the-html-antiforgerytoken">jQuery Ajax calls and the Html.AntiForgeryToken()</a></em>
  But I kept getting the following exception:</p>
  
  <blockquote>
    <p>System.Web.Mvc.HttpAntiForgeryException (0x80004005): The required
    anti-forgery form field "__RequestVerificationToken" is not present.</p>
  </blockquote>
  
  <p><em>edit</em></p>
  
  <p>I manged to workaround it doing this:</p>
  
  <pre><code>function AddAntiForgeryToken(data) {
      data.append('__RequestVerificationToken',$('#__AjaxAntiForgeryForm input[name=__RequestVerificationToken]').val());
      return data;
  };
  
  function CallAjax(url, type, data, success, error) {
  
      var ajaxOptions = { url: url, type: type, contentType: 'application/json'};
  
      if (type == 'POST') {
          var fd = new window.FormData();
          fd = AddAntiForgeryToken(fd);
          $.each(data, function (i, n) {
              fd.append(i,n);
          });
          data = fd;
          ajaxOptions.processData = false;
          ajaxOptions.contentType = false;
      }
  
      ajaxOptions.data = data;
  
      if (success) ajaxOptions.success = success;
  
      //If there is a custom error handler nullify the general statusCode setting.
      if (error) {
          ajaxOptions.error = error;
          ajaxOptions.statusCode = null;
      };
  
      $.ajax(ajaxOptions);
  }
  </code></pre>
  
  <p>But unfortunately FormData() is only supported in latest browser versions.
  Any workaround that could work before FormData() as introduced? </p>
  
  <p><em>edit</em>
  I wonder why the <em>ValidateAntiForgeryTokenAttribute</em> looks for the AntyForgeryToken only in the Form data, and doesn't look for it in the rout values as you can see below in the code of the sealed classes <em>AntiForgeryTokenStore</em> and <em>AntiForgeryWorker</em>?</p>
  
  <pre><code>public void Validate(HttpContextBase httpContext)
  {
    this.CheckSSLConfig(httpContext);
    AntiForgeryToken cookieToken = this._tokenStore.GetCookieToken(httpContext);
    AntiForgeryToken formToken = this._tokenStore.GetFormToken(httpContext);
    this._validator.ValidateTokens(httpContext, AntiForgeryWorker.ExtractIdentity(httpContext), cookieToken, formToken);
  }
  
  
  public AntiForgeryToken GetFormToken(HttpContextBase httpContext)
  {
    string serializedToken = httpContext.Request.Form[this._config.FormFieldName];
    if (string.IsNullOrEmpty(serializedToken))
      return (AntiForgeryToken) null;
    else
      return this._serializer.Deserialize(serializedToken);
  }
  </code></pre>