2016-07-11 11 views
0

JQuery関数は正常に動作しますが、アクションメソッドに[AntiForgerToken]を有効にすると、JQuery関数はアクションメソッドにアクセスできません。私はAntiForgeryTokenを有効にし、他のスニペットがあります。[AntiForgeryToken]が有効な場合、JQueryからアクションメソッドにアクセスできない

@using (Html.BeginForm("InsertStudent","Students",FormMethod.Post, new { @id="myform"})) 
{ 
    @Html.AntiForgeryToken() 

ビュー内の@Html.AntiForgeryToken()が有効にされているかどうかは関係ありません、jQueryの機能は良い作品を、問題との1はアクションメソッドであります...

どうしてですか?私は何が欠けているのですか?私が読んだことは、ポストアクションメソッドで[AntiForgeryToken]を有効にしてセキュリティを確保することが非常に重要であるため、アプリケーションがアクションメソッドとビューの両方の場所で有効になっている必要があると思います。

jQueryの機能:

function InsertShowStudents() { 
    var counter = 0; 
    $.ajax({   
     type:"post", 
     url: "/Students/InsertStudent/", 
     data: { Name: $("#Name").val(), LastName: $("#LastName").val(), Age: $("#Age").val() } 
    }).done(function (result) { 
     if (counter==0) { 
     GetStudents(); 
     CounterStudents(); 
      counter = 1; 
     } 
     else { 
      $("#tableJQuery").append("<tr>"+"<td>"+result.Name+"</td>"+"<td>"+result.LastName+"</td>"+"<td>"+result.Age+"</td>"+"</tr>") 
     } 
     //clear the form 
     $("#myform")[0].reset(); 
    }).error(function() { 
     $("#divGetStudents").html("An error occurred") 
    }) 
} 

対処方法:テーブルの

[HttpPost] 
     [ValidateAntiForgeryToken] 
     public ActionResult InsertStudent(Student student) 
     { 
      if (ModelState.IsValid) 
      { 
       db.Students.Add(student); 
       db.SaveChanges(); 
       //ModelState.Clear(); 
       return RedirectToAction("InsertStudent"); 
      } 
      return View(student); 
     } 

列:

@foreach (var item in Model) { 
    <tr> 
     <td> 
      @Html.DisplayFor(modelItem => item.Name) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.LastName) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.Age) 
     </td> 
     @* <td style="display:none" class="tdStudentID">@Html.DisplayFor(modelItem => item.StudentID)</td> *@ 
     <td> 
      <img src="~/images/deleteIcon.png" width="20" height="20" class="imgJQuery" data-id="@item.StudentID" /> 
     </td> 
     <td> 
      @Html.ActionLink("Details","Details", new { id=item.StudentID}) 
     </td> 
    </tr> 
} 
+1

あなたはajaxデータにトークンの値を渡しません。 'data:$( '#myform')。serialize()を使うと簡単です。それはトークンを含むすべてのフォームコントロールをシリアライズします。しかし、あなたのPOSTメソッドで 'RedirectToAction()'を持つことは無意味です - ajaxコールは決してリダイレクトしません。 –

+0

@StephenMueckeそれは今働いています:)私はあなたにポイントを与えることができるように、または私はそれを行う場合は、あなたが好きですか答えを投稿するつもりですか? – AlexGH

+0

私に20分を与えると、私はこれと別の代替も追加します –

答えて

1

あなたのAJAX呼び出しでトークンの値を渡していないので、例外がスローされます。あなたはそれだけでトークン

が含まれるフォームをシリアル化することが容易である、しかし

var token = $('[name=__RequestVerificationToken]').val(); 

を使用してトークンの値を取得し、

data: { __RequestVerificationToken: token, Name: $("#Name").val(), LastName: $("#LastName").val(), Age: $("#Age").val() } 

を使用して、それを含めるためにあなたのAJAX呼び出しを変更することができます

$.ajax({   
    type:"post", 
    url: '@Url.Action("InsertStudent", "Students")', // don't hardcode your url's 
    data: $('#myform').serialize(), 
}).done(function (result) { 

サイドノート:Ajaxコールは決してリダイレクトされません(Ajaxの全ポイントは同じページにとどまる)ので、InsertStudent()return RedirectToAction("InsertStudent");は動作しません。さらに、返信するHTMLは、.done()コールバックの$("#tableJQuery").append()コードが失敗します。

新しいStudentを追加するフォームがあるように見えるので、成功またはそうでない場合はJsonResultを返してください。成功した場合は、フォームの値に基づいてテーブルに新しい行を追加できますたとえば、

}).done(function (result) { 
    if (result) { 
     var row = $('<tr></tr>'); 
     row.append($('<td></td>').text($("#Name").val())); 
     ... // add other cells 
     $("#tableJQuery").append(row); 
     //clear the form 
     $("#myform")[0].reset(); 
    } else { 
     // Oops something went wrong 
    } 
}) 
+0

私は外部のjsファイルを使用していますので、 Url.Actionの情報を表示し、外部jsファイルのajaxから参照しました。これはうまく動作します。私はAction Methodも修正しました。成功したかどうかに関わらずJsonを返しています。 – AlexGH

+0

唯一のことは、img要素を持つ新しい列をテーブルに追加したので、img要素を削除すると(ajaxで実装された)img要素が削除されます。詳細アクションのメソッド、ので、私は機能と詳細のハイパーリンクとimg、データと行をajaxを使用して追加できるかどうかわからないGetStudents()関数を直接呼び出すことを提案しますか? – AlexGH

+1

隠された入力ではなく、 'data- *'属性を使うべきです。たとえば、スクリプトをトリガするボタンで、 'data-url =" @ Url.Action(....) "を追加し、' var url = $(this).data( ' url '); '。しかし、あなたのケースでは 'Html.BeginForm()'で生成した '

'タグで既にそれを持っているので、 'url:$( '#myform')。attr( 'action');' –

関連する問題