2016-07-15 8 views
2

Ich habe ein kleines Problem mit Routing und Formulare auf ASP.NET Core 1.0.0. Ich habe die folgenden Aktionen:ASP.NET Core Formular mit ID in der Route

[Route("delete/{id:int}")] 
[HttpGet] 
public async Task<IActionResult> Delete(int id) 
{ 
    Post post = await _postsRepository.GetPost(id); 
    return View(new DeletePostViewModel 
    { 
     PostId=post.Id, 
     Title=post.Title 
    }); 
} 

[Route("delete"),HttpPost,ValidateAntiForgeryToken] 
public async Task<IActionResult> Delete([FromForm]DeletePostViewModel vm,string option) 
{ 
    if (option == "Delete") 
     await _postsRepository.DeletePost(vm.PostId); 
    return RedirectToAction("Index"); 
} 

Und meiner Meinung nach ich habe folgendes:

<form asp-action="Delete" asp-controller="AdminPosts" asp-area="Admin" method="post" role="form"> 
    <div class="form-group"> 
     <input type="hidden" asp-for="PostId"/> 
     <label asp-for="Title"></label> 
     <input type="text" asp-for="Title" class="form-control" readonly="readonly"/> 
    </div> 
    <p> 
     <input type="submit" name="option" value="Delete" class="btn btn-danger" /> 
     <input type="submit" name="option" value="Cancel" class="btn btn-default" /> 
    </p> 
</form> 

Aber es ist nicht die Strecke richtig zu lösen. Die Route, die ich für den Formularbeitrag erhalte, hat auch die ID und löst daher die ID nicht auf. Ich muss entweder die ID in das Formular Methode hinzufügen:

[Route("delete/{id:int}"),HttpPost,ValidateAntiForgeryToken] 
public async Task<IActionResult> Delete(int id,[FromForm]DeletePostViewModel vm,string option) 

oder ich habe die ID explizit in Form taghelper zu entfernen:

<form asp-action="Delete" asp-controller="AdminPosts" asp-area="Admin" asp-route-id="" method="post" role="form"> 

Was könnte ich falsch hier tun? Warum löst es die Route nicht korrekt auf?

+0

Ich würde nicht empfehlen, ein HTTP-GET für einen Löschbefehl zu verwenden ... –

+0

@ JeremyHolovacs Der, der das Löschen tut, ist ein POST ... –

+0

Hmmm yup, sieht aus wie. Tut mir leid, ich dachte, das war Web API REST Anrufe –

Antwort

2

Ja, Sie müssten die id explizit entfernen, wie Sie bereits herausgefunden haben. Dies liegt daran, dass id ein Umgebungswert ist, weshalb er bei der Link-Generierung verwendet wird.

In Bezug auf, warum dies geschieht:
Im Allgemeinen (entweder regelmäßig oder Attribute Routen), wenn Routen sind bestellt werden, müssen die meist spezifischen Routen vor weniger spezifischen Routen kommen und auch Strecken mit größerer Anzahl von Segmenten kommen vor Routen mit geringerer Anzahl von Segmenten. In Ihrem Szenario würde die Route delete/{id:int} automatisch vor delete bestellt werden. Da der Wert für id jetzt Ambient ist, werden die Bedingungen der ersten Route erfüllt, und daher sehen Sie den auf diese Weise generierten Link. Um ihn zu beheben, müssten Sie ihn also löschen.