2017-11-02 1 views
0

Ich habe eine ASP.NET Core-Webanwendung. Einige meiner Anrufe, wie das Löschen, bevorzuge ich mit einer reinen Ajax-Anfrage anstatt mit einem tatsächlichen MVC-Formular und Postback. Mein Controller verfügt sowohl über Aktionen, die Ansichten zurückgeben, als auch über Aktionen wie die darunter liegende Löschmethode, die sich eher wie eine API verhält.Param ist Null, wenn AJAX-Anforderung an Controller in ASP.NET MVC Core

Mit dem unten Kern komme ich erfolgreich in die Aktion, aber die ID-Parameter ist immer Null. Was mache ich falsch?

MVC Controller:

// POST: Users/Delete/5 
    [HttpPost, ActionName("Delete")] 
    [ValidateAntiForgeryToken] 
    public async Task<IActionResult> Delete([FromBody] string id) 
    { 
     if (!ModelState.IsValid) 
     { 
      return BadRequest(ModelState); 
     } 

     var user = await _userManager.FindByIdAsync(id); 
     if (user == null) 
     { 
      return NotFound(); 
     } 

     await _userManager.DeleteAsync(user); 

     return Ok(user); 
    } 

AJAX Anfrage:

  $.ajax({ 
       url: '@Url.Action("Delete", "Projects")', 
       contentType: "application/json", 
       type: "POST", 
       headers: 
       { 
        "RequestVerificationToken": '@GetAntiXsrfRequestToken()' 
       }, 
       data: JSON.stringify({ "id": "ABC123" }), 
       success: function() { 
        alert('Deleted Successfully'); 
        // Remove row from grid. 
       } 
      }); 

Ist es üblich, beiden Aktionen zu schaffen zu haben, die Ansichten und Aktionen zurück, die für AJAX Requests in einem ASP-ähnlichen API-Aufrufen handeln .NET MVC-Webanwendung? Ich halte es nicht für einen API-Aufruf, weil ich immer noch die AntiForgeryToken weitergeben möchte.

+0

Ist param noch 'null', wenn Sie einen Beitrag machen Anfrage mit zB Postman? Ich versuche nur zu überprüfen, ob 'URL.Action()' die richtige URL generiert. – Ignas

Antwort

1

Sie senden eine JSON-Objekt { "id": "ABC123" } und so sollten Sie Ihre Aktion-Methode eine einfache Klasse mit id Eigenschaft erwarten:

public class Dto 
{ 
    public int Id {get; set;} 
} 

und

public async Task<IActionResult> Delete([FromBody] Dto data) 
+0

Macht Sinn, aber was würdest du empfehlen, wenn der Controller nur eine einfache ID als Parameter haben möchte. Soll ich die Aktionsmethode auf DELETE setzen und die ID in der URL senden? –

+0

@BlakeRivell tatsächlich ja, wenn Sie frei sind, einen anderen Endpunkt zu verwenden, und Sie dem REST-Muster folgen wollen, dann ist die Methode 'HTTP Delete' mit ID als Teil der URL die am besten geeignete Option. – Set

+0

Ich bin mir bewusst, dass dies eine Frage mit Präferenzen sein könnte, aber macht es Sinn, in einer ASP.NET MVC-App Aktionsmethoden zu verwenden, wenn ich reine AJAX-Aufrufe mache und keine Ansicht zurückgeben muss? Würden Sie empfehlen, einen API-Ordner für alles zu erstellen, das keine Ansicht zurückgibt? –

Verwandte Themen