Guten Morgen zusammen,
ich habe ein Problem, ein Formular mittels der Tag Helper ans Laufen zu bekommen.
Das Formular soll einen POST Request an meinen API-Controler, namentlich ImagesController richten.
Ich habe mir die Doku zu den Tag-Helpern angesehen, aber ich habe ein Problem mit der Action.
Wenn ich den Link hardcode, klappt das natürlich:
<form method="post" action="../../../_api/Qsj/Images/Upload/@lockCardId" enctype="multipart/form-data" class="dropzone" id="myAwesomeDropzone"></form>
So sieht mein Controller aus:
[Route("_api/Qsj/[controller]/Upload/{lockCardId:int}")]
[HttpPost]
public async Task<IActionResult> Upload(int lockCardId)
{...}
Aber wie erzeuge ich die Route mittels Tag-Helper?
<form method="post" asp-controller="_api/Qsj/Images" asp-action="Upload" asp-route-lockcardid="@lockCardId" enctype="multipart/form-data" class="dropzone" id="myAwesomeDropzone"></form>
Ich glaube mittlerweile jede Kombination von asp-controller durchprobiert zu haben.
Also auch _api/Qsj/Images/Upload ohne action-TagHelper.
Das action-Attribut in der gerenderten Seite ist immer leer.
Vielleicht könntet Ihr mir das einmal erklären.
Besten Dank,
monsee
Ok, ich habe es jetzt nach einigem Probieren rausgefunden.
Meine Route im Controller:
[Route("_api/Qsj/Images/{lockcardid:int}")]
[HttpPost("{lockcardid}")]
public async Task<IActionResult> Upload(int lockCardId)
{
}
Mein Formular:
<form method="post" asp-controller="Images" asp-action="Upload" asp-route-lockcardid="@lockCardId" enctype="multipart/form-data" class="dropzone" id="myAwesomeDropzone"></form>
Was ich noch nicht ganz kapiere: Meine Controller Klasse heißt ImagesController und liegt im Namespace: TestApp._api.Qsj
Wenn ich einen weiteren ImagesController in einem anderen Namespace hätte:
TestApp._api.Xyz, woher weiß der Tag-Helper denn dann, welchen Controller er verwenden muss?
Oder ist das eher so, dass ich nur einen ImagesController habe und mittels der Methoden, was ja dem asp-action entspricht arbeiten muss? Also dass ich dann jeweils eine Methode für zum Beispiel:
UploadImages(int lockCardId)
UploadDocument(int lockCardId)
...
Brauche?
monsee
Dein Namespace ist natürlich Käse, siehe Names of Namespaces
Ansonsten absolutes Basic: verwende Routen - und zwar nicht nur in der Definition, sondern auch in der View.
D.h. Route by Name.
Der Namespace ist völlig egal - muss er auch sein.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code