2 votes

Aide à la balise de formulaire MVC Core qui hérite de l'URL de la vue actuelle pour son attribut action.

Avec MVC5 (et les frameworks MVC plus anciens), j'étais en mesure d'écrire mon formulaire sans spécifier la méthode contrôleur/action :

@using (Html.BeginForm())
{
}

De cette façon, j'ai pu réutiliser le formulaire avec une URL différente. Si le formulaire était appelé depuis la route "/books/2/edit", le HTML généré serait :

<form action="/books/2/edit"></form>

Et si j'appelle le formulaire en utilisant l'URL "/books/add", le HTML généré serait :

<form action="/books/add"></form>

Comment puis-je faire de même avec la syntaxe de l'assistant de balisage ? J'ai essayé toutes sortes de syntaxes, mais elles génèrent toujours un attribut d'action vide :

<form></form>
<form asp-route=""></form>
<form asp-controller="" asp-action=""></form>

Résultat :

<form></form>
<form action></form>
<form action></form>

2voto

NightOwl888 Points 4622

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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X