Lors de l'utilisation des aides HTML, les valeurs qui ne sont pas fournies explicitement sont remplacées par défaut par les valeurs de la route qui se trouvent dans la balise demande actuelle . C'est la raison pour laquelle vous pouvez spécifier BeginForm
sans paramètres.
Lorsque vous utilisez des aides de balises, cette logique par défaut ne s'applique plus - les valeurs doivent être fournies explicitement. Il n'y a pas de valeurs par défaut.
Option 1 - form
étiquette
La façon la plus simple d'imiter ce que l'aide HTML fait avec un fichier de type form
l'étiquette est :
<form action="@Url.RouteUrl(this.ViewContext.RouteData.Values)" method="post">
</form>
Option 2 - Html.BeginForm
Notez que votre syntaxe actuelle est également toujours valable dans ASP.NET Core MVC :
@using (Html.BeginForm())
{
}
Mais puisque vous deviez poser cette question, je dirais que c'est la façon dont l'URL est générée n'est absolument pas claire lorsque vous utilisez cette syntaxe, ce qui signifie que vous devriez probablement passer à l'utilisation de l'option Url.RouteUrl
pour le rendre plus lisible, même s'il est un peu plus long à écrire.
Option 3 - Aide à l'étiquetage
Voici un exemple de la façon dont vous pouvez utiliser une aide de balise pour y parvenir, même si c'est un peu laid.
Il existe un attribut d'aide pour les balises de formulaire asp-all-route-values
qui vous permet de transmettre toutes les valeurs de l'itinéraire dans un seul paramètre. Cependant, selon asp-all-route-data
doit être IDictionary<string,object>
o RouteValueDictionary
il n'est pas possible de faire passer un RouteValueDictionary
à cet attribut, il faudrait le convertir en un IDictionary<string, string>
. Une façon de le faire est de construire une méthode d'extension pour effectuer la conversion.
public static class RouteValueDictionaryExtensions
{
public static IDictionary<string, string> ToTagHelperValues(this RouteValueDictionary routeValueDictionary)
{
var result = new Dictionary<string, string>();
foreach (var kvp in routeValueDictionary)
{
result.Add(kvp.Key, kvp.Value as string);
}
return result;
}
}
Vous pouvez ensuite utiliser un assistant de balise pour générer l'URL actuelle comme suit :
<form asp-all-route-data="@this.ViewContext.RouteData.Values.ToTagHelperValues()">
</form>
Option 4 - Attribut sans action
Il est également possible d'utiliser une balise de formulaire sans action
attribut. Si vous omettez l'attribut action
le comportement par défaut de la plupart des navigateurs (sinon tous) est d'utiliser l'URL actuelle.
<form method="post">
</form>
AVERTISSEMENT : Il est non conforme aux normes pour utiliser cette option et, techniquement, le comportement des navigateurs n'a pas à adopter le comportement attendu qui consiste à utiliser l'URL actuelle si elle n'est pas fournie.
En fin de compte, la méthode que vous utilisez est une question de préférence.