Sto costruendo un modulo CMS Orchard che sto testando su un sito Orchard 1.3.10. Il modulo visualizza una vista dettagli per una delle mie entità e ho un pulsante "preferiti" che vorrei fare e fare un post ajax su un'azione del controller per salvare l'entità come preferita nel database.Token anti-contraffazione CMS Ajax di Orchard quando connesso
Ritenendo che ho il seguente codice:
<div style="padding: 10px;">
<span data-id="@Model.Id" id="addFavorite" style="cursor: pointer;">
[Add Favorite]
</span>
</div>
<script type="text/javascript">
$("#addFavorite").click(function() {
alert("here we go...");
$.ajax({
type: "post",
dataType: "",
url: "/orchardlocal/mymodule/stuff/AddFavorite",
data: { id: $(this).data("id") },
success: function (response) {
alert("it worked");
}
});
});
</script>
La mia azione di controllo è ...
[HttpPost]
public ActionResult AddFavorite(int id)
{
return View();
}
Quando eseguo il sito senza essere collegati in frutteto, questo codice i messaggi di nuovo solo bene. Se accedo e clic su Aggiungi preferito, ottengo questa eccezione ...
Un token anti-contraffazione richiesto non è stato fornito o non era valido.
System.Web.Mvc.HttpAntiForgeryException non gestito dal codice utente Messaggio = Un token anti-contraffazione richiesto non è stato fornito o non era valido. Source = System.Web.WebPages ErrorCode = -2147467259 WebEventCode = 0 StackTrace: a System.Web.Helpers.AntiForgeryWorker.Validate (HttpContextBase contesto, sale String) a System.Web.Helpers.AntiForgery.Validate (HttpContextBase HttpContext, sale String) a System.Web.Mvc.ValidateAntiForgeryTokenAttribute.OnAuthorization (AuthorizationContext> filterContext) a Orchard.Mvc.AntiForgery.AntiForgeryAuthorizationFilter.OnAuthorization (AuthorizationContext filterContext) in C: \ Codice \ OrchardDev2 \ src \ Orchard \ Mvc \ AntiForgery \ AntiForgeryAuthorizationFilter.cs: riga 37 su System.Web.Mvc.ControllerActionInvoker.InvokeAuthorizationFilters (ControllerContext controllerContext, IList`1 filtri, ActionDescriptor a ctionDescriptor) a System.Web.Mvc.ControllerActionInvoker.InvokeAction (ControllerContext controllerContext, String ActionName) InnerException:
Perché si tratti del post in modo diverso quando connesso e non?
Come posso fornire un token anti-forger per evitare questo?
Grazie, Brian
Sebastien, penso che ci sia un errore di battitura in quanto il __RequestVerificationToken dovrebbe essere all'interno dei dati {}, corretto? Inoltre, quando aggiungo @ Html.AntiForgeryTokenValueOrchard() a javascript, sto ottenendo una linea ondulata in VS che dice: "La compilazione condizionale è disattivata". Ho letto su un altro post che afferma che questo è un bug Razor ma dovrei farlo ... @ (Html.AntiForgeryTokenValueOrchard()). Ma quando faccio questo mi viene visualizzato l'errore javascript "sintassi errore 4". Cos'altro potrei mancare qui? Grazie, Brian –
Ho completato la risposta tenendo conto del tuo commento –
Sebastien, questo funziona benissimo. Grazie! –