J'ai le post ajax suivant sur ma page de rasoir index.cshtml qui fonctionne bien :

create: {
            url: "/api/LearningTasks/create",
            type: "POST",
            dataType: "json"
        },

Il envoie le message à mon contrôleur et la réception du code fonctionne bien. Cela ressemble à ceci :

[HttpPost]
    [Route("api/LearningTasks/create")]
    public async Task<ActionResult<LearningTask>> CreateLearningTask(LearningTask learningTask)
    {
        _context.LearningTasks.Add(learningTask);
        await _context.SaveChangesAsync();

        return CreatedAtAction("GetLearningTask", new { id = learningTask.Id }, learningTask);
    }

Je voudrais changer la cible de mon message pour qu'il aille dans le "code-behind" index.cshtml.cs. La méthode que j'aimerais recevoir ressemble à ceci:

 public async Task<IActionResult> OnPostAsync()
    {
        // This is where I want to have the send the data for the create operation instead of to /api/LearningTasks/create
        _context.LearningTasks.Add(LearningTask);
        await _context.SaveChangesAsync();

        return null;  
    }

J'ai essayé de supprimer la ligne url: "/api/LearningTasks/create", et de la définir sur url: "", mais aucune ne fonctionne. Toute aide pour comprendre comment faire cela serait grandement appréciée.

0
Roddy Balkan 19 févr. 2020 à 20:06

1 réponse

Meilleure réponse

Les pages Razor sont conçues pour être automatiquement protégées contre les attaques de falsification de requêtes intersites (CSRF/XSRF).

Vous devez envoyer le jeton anti-falsification dans l'en-tête de la requête au serveur en utilisant AJAX :

  1. Ajoutez explicitement en utilisant @Html.AntiForgeryToken(), cela ajoutera un type d'entrée masqué avec le nom __RequestVerificationToken.

  2. Envoyer le jeton dans l'en-tête de la requête :

    $.ajax({
        url: '/Index',
        type: 'POST',
        beforeSend: function (xhr) {
            xhr.setRequestHeader("XSRF-TOKEN",
                $('input:hidden[name="__RequestVerificationToken"]').val());
        },   
    })
    .done(function (result) { })
    
  3. Configurez le service antifalsification pour rechercher l'en-tête X-CSRF-TOKEN :

    services.AddAntiforgery(o => o.HeaderName = "XSRF-TOKEN");
    

L'article ci-dessous est pour votre référence:

Gérer les requêtes Ajax dans les pages Razor ASP.NET Core

0
Nan Yu 20 févr. 2020 à 02:53