ASP.NET Core 8 MVC: Die Aktion darf keinen anderen benannten Routenwert als die ID haben
Posted: 20 Jan 2025, 17:50
Hintergrund
Ich bin relativ neu im Umgang mit .NET Core und ASP.NET Core MVC, da ich zuvor an .NET 4 gewöhnt war. x und ASP.NET MVC 5, also haben Sie bitte Geduld, wenn ich etwas Offensichtliches frage; Ich konnte bei der Suche keine Antwort finden.
Verwendete Inhalte:
In der Startup.cs, wo unter anderem Dinge konfiguriert werden, habe ich:
Ich habe den folgenden JS auf meiner Seite, um einen Klick-Handler hinzuzufügen und einen AJAX-Löschvorgang durchzuführen:
Im obigen Beispiel sieht die für die AJAX-Anfrage verwendete href etwa so aus:
Das Formular, das serialisiert wird, enthält ein Anti-Fälschungs-Token aus der Zeit, als ich die MVC-Aktion mit [HttpPost] ausprobiert habe
< strong>Problem
Wenn ich einen Haltepunkt in der Aktionsmethode DoSomeDeletion setze, wird dieser nie erreicht. Wenn ich jedoch das Attribut „Route“ entferne, wird es getroffen.
Was ich versucht habe
Frage
Ich habe keine Attribute für verwendet Routing vorher, also übersehe ich vielleicht etwas, aber in ASP.NET MVC 5 auf .NET 4.8 hatte ich nie solche Probleme, ich könnte einen oder mehrere Routenwerte von der URL stammen lassen und so heißen, wie ich wollte.< /p>
Was ist los? Warum kann ich keine Routenwertnamen verwenden, die ich verwenden möchte?
Ich bin relativ neu im Umgang mit .NET Core und ASP.NET Core MVC, da ich zuvor an .NET 4 gewöhnt war. x und ASP.NET MVC 5, also haben Sie bitte Geduld, wenn ich etwas Offensichtliches frage; Ich konnte bei der Suche keine Antwort finden.
Verwendete Inhalte:
- .NET 8
ASP.NET Core MVC - jQuery
Code: Select all
[Area("SomeArea")]
public class SomeNameController : Controller
{
public SomeNameController(..injected stuff...) { }
[HttpGet]
public PartialViewResult AddDialog()
{
// ...
}
[HttpPost]
public async Task AddDialog(MyDialogModel dialogModel)
{
// ...
}
[HttpDelete]
[Route("DoSomeDeletion/{uniqueIdentifier}")]
public async Task DoSomeDeletion(int uniqueIdentifier)
{
// ...
return Json(result);
}
}
Code: Select all
app.UseEndpoints(endpoints =>
{
endpoints.MapRazorPages();
endpoints.MapBlazorHub();
endpoints.MapControllerRoute(
name: "areas",
pattern: "{area:exists}/{controller=index}/{action=Index}/{id?}");
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=index}/{action=Index}/{id?}");
endpoints.MapFallbackToPage("/_Host");
});
Code: Select all
$("#MyGrid").on('click', '.js-delete-btn', function (e) {
e.preventDefault();
var url = this.href,
data = $("#GridForm").serializeObject();
$.ajax({
method: "DELETE",
url: url,
data: data
})
.done(function (jqXHR, textStatus) {
toastr.success("Yay! Deleted successfully", null, {
timeout: 5000,
onHidden: function () { window.location.reload(); }
});
})
.fail(function (jqXHR, textStatus, errorThrown) {
toastr.error("Uh-oh something went wrong", null, { timeout: 5000 });
});
});
Code: Select all
/SomeArea/SomeName/DoSomeDeletion/356
< strong>Problem
Wenn ich einen Haltepunkt in der Aktionsmethode DoSomeDeletion setze, wird dieser nie erreicht. Wenn ich jedoch das Attribut „Route“ entferne, wird es getroffen.
Was ich versucht habe
- Ich habe versucht, [HttpPost] anstelle von [HttpDelete] zu verwenden
- Für beide HttpDelete und HttpPost habe ich die Überladung verwendet, mit der Sie angeben können eine Routenvorlage, die dem Route-Attribut entspricht
- Wenn ich die URL so ändere, dass die ID eine Abfragezeichenfolge ist, z. B. ?uniqueIdentifier=365, dann wird die Aktion ausgeführt und der Wert wird an den Aktionsparameter gebunden.
- Entfernen des Routenattributs, sodass die Aktion ausgeführt wird. Ich sehe, dass Request.RouteValues einen {id} Wert, der auf den Wert der von mir erstellten URL gesetzt ist DELETE AJAX-Aufruf an.
Frage
Ich habe keine Attribute für verwendet Routing vorher, also übersehe ich vielleicht etwas, aber in ASP.NET MVC 5 auf .NET 4.8 hatte ich nie solche Probleme, ich könnte einen oder mehrere Routenwerte von der URL stammen lassen und so heißen, wie ich wollte.< /p>
Was ist los? Warum kann ich keine Routenwertnamen verwenden, die ich verwenden möchte?