2016-12-27 6 views
1

MVC 5にajaxを使用してデータを保存しようとしています。@Html.AntiForgeryToken()のないフォームデータの場合はうまく動作します。しかし、それは@Html.AntiForgeryToken()を使用して私にObject reference not set to an instance of an objectエラーを表示しています。データはJSONの代わりに、HTMLフォームのデータを経由して送信されているので、これが起こっているMVC 5のValidateAntiForgeryTokenでNullReferenceExceptionが表示されます

[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult Create([Bind(Include = "Address,JoinDate,DoB,Gender,BloodGroup,Email,LastName,FirstName,Mobile,UpdateDate,UpdatedBy,Status,EmployeeType,CreatedBy,CreateDate,DesignationId")] EmpDetail empDetail) 
{ 
    try 
    { 
     Regex rgx = new Regex("[^a-zA-Z0-9 - .]"); 
     empDetail.FirstName = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(rgx.Replace(empDetail.FirstName, "").ToLower()).Trim(); 
     empDetail.LastName = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(rgx.Replace(empDetail.LastName, "").ToLower()).Trim(); 
     empDetail.Email = empDetail.Email.ToLower().Trim(); 
     empDetail.UpdateDate = DateTime.Now; 
     empDetail.CreatedBy = 234; 
     empDetail.CreateDate = DateTime.Now; 
     empDetail.UpdatedBy = 234; 
     empDetail.Status = 1; 

     if (ModelState.IsValid) 
     { 
      db.EmpDetails.Add(empDetail); 
      db.SaveChanges(); 
      return Json(1); 
     } 
     else 
     { 
      return Json(2); 
     } 
    } 
    catch (Exception e) 
    { 
     return Json(e.Message); 
    } 
} 

答えて

1

$.ajax({ 
    type: "POST", 
    url: "/Employees/Create", 
    data: data, 
    async: false, 
    success: function (result) { 
     if (result == 1) { 
      window.location.href = '/Employees'; 
     } 
     else { 
      $('#error-span').html('Error in insert.'); 
     } 
    }, 
    error: function() { 
     alert('Failed'); 
    } 
}); 

はここに私のコントローラメソッドである:ここに私のajaxコードです。ヘッダーにトークンを渡そうとする必要があります。たとえば、次のように

ビュー:

<script> 
    @functions{ 
     public string TokenHeaderValue() 
     { 
      string cookieToken, formToken; 
      AntiForgery.GetTokens(null, out cookieToken, out formToken); 
      return cookieToken + ":" + formToken;     
     } 
    } 

    $.ajax("api/values", { 
     type: "post", 
     contentType: "application/json", 
     data: { }, // JSON data goes here 
     dataType: "json", 
     headers: { 
      'RequestVerificationToken': '@TokenHeaderValue()' 
     } 
    }); 
</script> 

コントローラー:

void ValidateRequestHeader(HttpRequestMessage request) 
{ 
    string cookieToken = ""; 
    string formToken = ""; 

    IEnumerable<string> tokenHeaders; 
    if (request.Headers.TryGetValues("RequestVerificationToken", out tokenHeaders)) 
    { 
     string[] tokens = tokenHeaders.First().Split(':'); 
     if (tokens.Length == 2) 
     { 
      cookieToken = tokens[0].Trim(); 
      formToken = tokens[1].Trim(); 
     } 
    } 
    AntiForgery.Validate(cookieToken, formToken); 
} 

出典:https://www.asp.net/web-api/overview/security/preventing-cross-site-request-forgery-csrf-attacks

関連する問題