2017-07-20 17 views
1

私の部分的な見解では、私は私の部分ビューで@Html.AntiForgeryToken()を追加しているだけでなく、私はコントローラに[ValidateAntiForgeryToken]を追加しましたが、私はこのerror.The The required anti-forgery form field"__RequestVerificationToken" is not present.私はいくつかのjqueryコードを使用して送信しました。しかし、私は再びエラーが発生しました。私はStackOverflowのすべての質問を読んだが、彼らは私を助けることができませんでした。asp.net mvc "必要な偽造防止フォームフィールド" __ RequestVerificationToken "はありません。"

@model Dentistry.Areas.ViewModels.UserViewModel 

    <div class="modal-header"> 
     <button type="button" class="close" data-dismiss="modal" aria-hidden="true"> 
      <span class="glyphicon glyphicon-remove" aria-hidden="true"></span> 
     </button> 
     <h4 class="modal-title custom_align" id="Heading">ویرایش کاربران</h4> 

    </div> 

    @if (Model != null && Model.UserId != string.Empty) 
    { 
     <div class="modal-body" id="editModal"> 
      <form id="#myForm"> 
       @Html.AntiForgeryToken() 
       <div class="form-group"> 
        @Html.HiddenFor(a => a.UserId) 
       </div> 
       <div class="form-group"> 
        <label>نام کاربری</label> 
        @Html.TextBoxFor(a => a.UserName, new { @class = "form-control" }) 
        @Html.ValidationMessageFor(a => a.UserName) 
       </div> 
       <div class="form-group"> 
        <label>نام</label> 
        @Html.TextBoxFor(a => a.FirstName, new { @class = "form-control" }) 
        @Html.ValidationMessageFor(a => a.FirstName) 
       </div> 

       <div class="form-group"> 
        <label>نام خانوادگی</label> 
        @Html.TextBoxFor(a => a.LastName, new { @class = "form-control" }) 
        @Html.ValidationMessageFor(a => a.LastName) 
       </div> 
       <div class="form-group"> 
        <label>جنسیت</label> 
        @Html.TextBoxFor(a => a.Gender, new { @class = "form-control" }) 
        @Html.ValidationMessageFor(a => a.Gender) 
       </div> 
       <div class="form-group"> 
        <label>وضعیت</label> 
        @Html.TextBoxFor(a => a.IsActive, new { @class = "form-control" }) 
        @Html.ValidationMessageFor(a => a.IsActive) 
       </div> 

       <div class="form-group"> 
        <label>ایمیل</label> 
        @Html.TextBoxFor(a => a.Email, new { @class = "form-control" }) 
        @Html.ValidationMessageFor(a => a.Email) 
       </div> 
       <div class="form-group"> 
        <label>آدرس</label> 
        @Html.TextBoxFor(a => a.Address, new { @class = "form-control" }) 
        @Html.ValidationMessageFor(a => a.Address) 
       </div> 
       <div class="form-group"> 
        <label>شماره تماس</label> 
        @Html.TextBoxFor(a => a.PhoneNumber, new { @class = "form-control" }) 
        @Html.ValidationMessageFor(a => a.PhoneNumber) 
       </div> 

       <a href="#" id="btnSubmit" class="btn btn-success btn-block">ویرایش</a> 

      </form> 


     </div> 
    } 
    <script> 
     $(document).ready(function() { 



      $("#btnSubmit").click(function() { 
       var token = $('input[name="__RequestVerificationToken"]').val(); 
       var headers = {}; 
       // other headers omitted 
       headers['__RequestVerificationToken'] = token; 
       // $('#loaderDiv').show(); 
       var myFormData = $("#myForm").serialize(); 
       console.log(myFormData); 
       $.ajax({ 
        cache:false, 
        type: "POST", 
        headers: headers, 
        url: "/Users/Edit", 
        dataType:"json", 
        data: myFormData, 
        success: function() { 
         // $('#loaderDiv').hide(); 
         $('#edit').modal('hide'); 
         window.location.href = "/Users/Index"; 
        } 

       }); 

      }); 

     }); 
    </script> 

=========================================== ====

[HttpPost] 
    [ValidateAntiForgeryToken] 
    // [Bind(Include = "UserID,UserName,PasswordHash,FirstName,LastName,Gender,Email,CreateDate,IsActive,Address,PhoneNumber")] 
    public ActionResult Edit(UserViewModel user) 
    { 
     // 
     //bool status=false; 
     if (ModelState.IsValid) 
     { 
      var userQuery=db.User.SingleOrDefault(u => u.Id == user.UserId); 
      if (user.UserId != string.Empty) 
      { 
       userQuery.FirstName = user.FirstName; 
       userQuery.LastName = user.LastName; 
       userQuery.PhoneNumber = user.PhoneNumber; 
       userQuery.UserName = user.UserName; 
       userQuery.Email = user.Email; 
       userQuery.Address = user.Address; 
       userQuery.Gender = Convert.ToBoolean(user.Gender); 
       userQuery.IsActive = Convert.ToBoolean(user.IsActive); 
      } 
      else 
      { 
       User userDB=new User(); 
       userDB = userQuery; 
       db.User.Add(userDB); 
      } 
      // db.Entry(user).State = EntityState.Modified; 
      db.SaveChanges(); 
      //status = true; 

     } 
     return RedirectToAction("Index"); 
     // return View(user); 
     // return new JsonResult { Data = new { status = status } }; 
    } 
+0

AFTは非表示フィールドに入り、その非表示フィールドを返信していません。つまり、私はjsonデータと一緒にそれをポストする方法がわかりません。これはhttps://stackoverflow.com/questions/4074199/jquery-ajax-calls-and-the-html-antiforgerytokenに役立ちますか?私はいくつかのコードをチェックしようとしています。私はこれを前にしたと確信しています... –

+0

jsonオブジェクトに追加すると 'myFormData .__ RequestVerificationToken = $( 'input [name = "__ RequestVerificationToken"] ')。val(); 'トリックを行うべきである –

+0

フォームIDの中に#を入れないでください。 –

答えて

2

の代わりに、クライアント側タグの使用かみそりformタグ

@using (Html.BeginForm("Action", "Controller", FormMethod.Post, new { id = "formID", @class = "form-horizontal" })) 
     { 

//formCode 
} 

を使用して、クライアント側の

のようになります。
$(function(){ 
    $('#formID').on('submit',function(e){ 
e.preventDefault(); 
    SubmitForm(); 
    }) 
}) 
    function SubmitForm() { 
      var data = $("#RequestForm").serialize(); 
      var url = "/RequestManagement/ProcessRequest" 
      var form = $('#RequestForm')[0] 
      var formdata = false; 
      if (window.FormData) { 
       formdata = new FormData(form); 
      } 
      $.ajax({ 
       url: url, 
       type: 'POST', 
       dataType: 'json', 
       data: formdata ? formdata : data, 
       cache: false, 
       contentType: false, 
       // enctype: 'multipart/form-data', 
       processData: false, 
       success: function (data) { 
        if (data == "SessionTimeout") { 
         window.location.href = "/Account/Relogin"; 
        } 

と私のフォームは、あなたがリクエストヘッダにantiforgeryトークンを入れている

@using (Html.BeginForm("ProcessRequest", "RequestManagement", FormMethod.Post, new { id = "RequestForm", @class = "form-horizontal" })) 
    { 
     @Html.AntiForgeryToken(); 
     <div class="box-body"> 
      <div class="form-group"> 
       <label for="selectStatus" class="col-sm-2 control-label">Status :</label> 
       <div class="col-sm-10"> 
        <select class="form-control" name="StatusID" id="selectStatus" data-val="true" data-val-required="Please select a Status."> 
         <option value="" selected="selected">--Select Status--</option> 
        </select> 
        <span data-valmsg-for="StatusID" data-valmsg-replace="true"></span> 
        <input type="hidden" name="StatusName" id="statusName" /> 
       </div> 
      </div> 
      <div class="form-group"> 
       <label for="textComment" class="col-sm-2 control-label">Comment :</label> 

       <div class="col-sm-10"> 
        <textarea class="form-control" name="Comment" id="textComment" style="resize:none;" placeholder="Comment" rows="3" data-val="true" data-val-required="Please enter a Comment."></textarea> 
        <span data-valmsg-for="Comment" data-valmsg-replace="true"></span> 
       </div> 
      </div> 
      <input type="hidden" name="RequestID" id="requestIDHolder" required /> 
     </div> 
     <div class="box-footer"></div> 
     <!-- /.box-body --> 
     <div class="modal-footer"> 
      <button type="submit" class="btn btn-info">Save</button> 
      <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button> 
     </div> 

    } 
+0

解決済みです。あなたのajaxメソッドは動作しません。実際には、私は成功関数に警告を追加しましたが、動作しません。私のための解決策があれば、この質問で私に教えてください:http://stackoverflow.com/ #45222082/how-to-close-modal-popup-bootstrap-and-update-dat-after-ajax-call-in-asp-n?noredirect = 1#comment77410895_45222082 – rayan

0

のようなものです。投稿しているフォームデータオブジェクトに追加してください:

myFormDatadata.__RequestVerificationToken = token; 
+0

彼はそれが偽造防止トークンを解決した問題は、サーバー側の戻り値+あなたはmyFormDatadataを呼び出す必要はありません.__ RequestVerificationToken = token; –

関連する問題