2016-07-11 2 views
0

Ich habe eine JQuery-Funktion, die funktioniert, aber wenn ich [AntiForgerToken] für die Aktionsmethode aktivieren, kann die JQuery-Funktion nicht auf die Aktionsmethode zugreifen andere Schnipsel, wo ich AntiForgeryToken aktiviert:Kann nicht auf Aktionsmethode von JQuery zugreifen, wenn [AntiForgeryToken] aktiviert ist

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

Es spielt keine Rolle, ob die @Html.AntiForgeryToken() innerhalb der Ansicht aktiviert ist oder nicht, die JQuery-Funktion funktioniert gut, das man mit dem Problem ist bei der Aktion Methode ...

Warum passiert das? Was ich vermisse? Ich habe gelesen, ist sehr wichtig für die Sicherheit zu [AntiForgeryToken] auf die Post-Aktion Methoden aktiviert haben, so denke ich, dass die Anwendung mit es aktiviert in beiden Orten die Aktionsmethode und die Ansicht funktionieren sollte.

JQuery-Funktion:

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") 
    }) 
} 

Aktionsmethode:

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

Spalten der Tabelle:

@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

Sie übergeben den Wert des Tokens in den Ajax-Daten nicht. Am einfachsten, wenn Sie einfach 'data: $ ('# myform'). Serialize() verwenden, was alle Formularsteuerelemente einschließlich des Tokens serialisiert. Aber 'RedirectToAction()' in Ihrer POST-Methode ist sinnlos - Ajax-Aufrufe werden niemals umgeleitet. –

+0

@StephenMuecke es funktioniert jetzt :), werden Sie die Antwort posten, damit ich Ihnen den Punkt geben kann oder bevorzugen Sie, wenn ich das tue? – AlexGH

+0

Geben Sie mir 20 Minuten und ich werde diese und eine andere Alternative sowie –

Antwort

1

Sie nicht den Wert des Tokens in Ihrem Ajax-Aufruf vorbei so ein Ausnahme wird ausgelöst. Sie können den Wert des Tokens erhalten

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

verwenden und Ihre Ajax-Aufruf modifizieren

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

jedoch mit einzubeziehen, ist es einfacher, nur das Formular serialisiert, die das Token

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

Seitennotiz: Ajax Anrufe nie umleiten (der ganze Punkt von Ajax ist es, auf der gleichen Seite zu bleiben) so return RedirectToAction("InsertStudent"); in Ihrem InsertStudent() wird nicht funktionieren. Darüber hinaus wird Ihre Rückkehr HTML, so dass die $("#tableJQuery").append() Code in der .done() Rückruf wird fehlschlagen.

Es scheint, Sie haben ein Formular, eine neue Student so Ihre Methode einfach hinzufügen müssen einen JsonResult angibt, Erfolg oder Misserfolg zurückzukehren, und dann erfolgreich, wenn, dann können Sie eine neue Zeile in Ihre Tabelle in Form basierend auf den Werten hinzufügen B.

}).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

sehr schön, ich benutze eine externe js-Datei, so dass ich einen versteckten Eingabetext in meinem deklariert View mit den Informationen der Url.Action und ich referenzierte es von Ajax in der externen js-Datei, das funktioniert gut. Ich habe auch die Aktionsmethode geändert und ich gebe Json den Erfolg zurück oder nicht. – AlexGH

+0

Das einzige Ding ist, dass ich in meiner Tabelle eine neue Spalte mit einem img Element so hinzufügte, wenn auf das img klickt, das das Element gelöscht wird (eingeführt mit ajax), fügte ich auch andere Spalte hinzu, die Details mit Details des Kursteilnehmers genannt wurde die Details Aktionsmethode, also bin ich mir nicht sicher, ob ich hinzufügen kann mit ajax eine Zeile mit den Daten, die img mit der Funktionalität und dem Hyperlink Details, schlagen Sie vor, dass ich die GetStudents() Funktion direkt aufrufen? – AlexGH

+1

Anstatt einer versteckten Eingabe sollten Sie 'data- *' Attribute verwenden. In einer Schaltfläche, die das Skript auslöst, können Sie zum Beispiel add 'data-url =" @ Url.Action (....) "' verwenden und dann mit 'var url = $ (this) .data (' URL '); '. Aber in Ihrem Fall haben Sie es bereits in der '

' Tag Ihre Generierung mit 'Html.BeginForm()', so können Sie einfach 'URL: $ ('# myform'). Attr ('Aktion');' –

Verwandte Themen