web-dev-qa-db-fra.com

Quelle est la différence entre Html.Hidden et Html.HiddenFor

Je peux trouver une bonne définition de Html.HiddenFor sur MSDN, mais la seule chose que je puisse trouver sur Html.Hidden est liée à ses problèmes.

Quelqu'un peut-il me donner une bonne définition et un exemple?.

60
Joe Pitz

La plupart des méthodes d'assistance MVC ont une variante XXXFor. Ils sont destinés à être utilisés avec une classe de modèle concrète. L'idée est de permettre à l'assistant de dériver l'attribut "name" approprié pour le contrôle de saisie de formulaire en fonction de la propriété spécifiée dans le lambda. Cela signifie que vous devez éliminer les "chaînes magiques" que vous auriez sinon dû utiliser pour corréler les propriétés du modèle avec vos vues. Par exemple:

Html.Hidden("Name", "Value")

Aura pour résultat:

<input id="Name" name="Name" type="hidden" value="Value">

Dans votre contrôleur, vous pourriez avoir une action comme:

[HttpPost]
public ActionResult MyAction(MyModel model) 
{
}

Et un modèle comme:

public class MyModel 
{
    public string Name { get; set; }
}

Le cru Html.Hidden nous avons utilisé ci-dessus sera corrélé à la propriété Name du modèle. Cependant, il est désagréable que la valeur "Nom" de la propriété doive être spécifiée à l'aide d'une chaîne ("Nom"). Si vous renommez la propriété Name sur le modèle, votre code sera cassé et l'erreur sera un peu difficile à comprendre. Par contre, si vous utilisez HiddenFor, vous êtes protégé de cela:

Html.HiddenFor(x => x.Name, "Value");

Maintenant, si vous renommez la propriété Name, vous obtiendrez une erreur d'exécution explicite indiquant que la propriété est introuvable. En outre, l’analyse statique offre d’autres avantages, tels que l’affichage d’une liste déroulante des membres après la saisie de x..

109
Kirk Woll

Le Html.Hidden crée une entrée cachée Mais vous devez spécifier le nom et tout l'attribut que vous voulez donner à ce champ et la valeur, tandis que le Html.HiddenFor crée une entrée cachée pour l'objet que vous lui transmettez, ils ressemblent à ceci:

Html.Hidden("yourProperty",model.yourProperty);

Html.HiddenFor(m => m.yourProperty)

Dans ce cas, le résultat est le même!

15
Marco Leo

Chaque méthode de la classe HtmlHelper a un jumeau avec le suffixe For. Html.Hidden prend une chaîne en tant qu'argument que vous devez fournir, mais Html.HiddenFor prend un Expression si vous affichez un vue fortement typée vous pouvez en tirer profit et alimenter cette méthode avec un expression lambda comme ceci

o=>o.SomeProperty 

au lieu de "SomeProperty" dans le cas de l'utilisation de la méthode Html.Hidden.

7
Jahan Zinedine

Html.Hidden ('name', 'value') crée une balise masquée avec name = 'name' et value = 'value'.

Html.HiddenFor (x => x.nameProp) crée une balise masquée avec un nom = 'nameProp' et une valeur = x.nameProp.

À première vue, ils semblent faire la même chose, l'un juste plus pratique que l'autre. Mais sa valeur réelle est pour la liaison de modèle. Lorsque MVC essaie d'associer le code HTML au modèle, il doit avoir le nom de la propriété. Pour Html.Hidden, nous avons choisi "nom" et non "nomProp". Par conséquent, la liaison ne fonctionnerait pas. Vous devez avoir un objet de liaison personnalisé ou obtenir les valeurs à partir des données du formulaire. Si vous réaffichez la page, vous devez redéfinir les valeurs du modèle.

Vous pouvez donc utiliser Html.Hidden, mais si vous vous trompez de nom ou si vous modifiez le nom de la propriété dans le modèle, la liaison automatique échouera lorsque vous envoyez le formulaire. Mais en utilisant une expression de type vérifié, vous obtiendrez du code et, lorsque vous modifierez le nom de la propriété, vous obtiendrez une erreur lors de la compilation. Et puis vous êtes assuré d'avoir le nom correct dans le formulaire.

Une des meilleures fonctionnalités de MVC.

3
Gerard ONeill

Html.Hidden et Html.HiddenFor étaient utilisés pour générer des paires nom-valeur attendues par la méthode d'action dans le contrôleur. Exemple d'utilisation (*):

@using (Html.BeginForm("RemoveFromCart", "Cart")) {
                    @Html.Hidden("ProductId", line.Product.ProductID)
                    @Html.HiddenFor(x => x.ReturnUrl)
                    <input class="btn btn-sm btn-warning"
                           type="submit" value="Remove" />
                }

Si votre méthode d’action attend "ProductId", vous devez générer ce nom sous la forme en utilisant (Html.Hidden ou Html.HiddenFor). Dans le cas où il n’est pas possible de générer ce nom avec un modèle fortement typé, il vous suffit d’écrire ce nom avec un chaîne qui est "ProductId".

public ViewResult RemoveFromCart(int productId, string returnUrl){...}

Si j'avais écrit Html.HiddenFor (x => line.Product.ProductID), l'assistant rendrait un champ masqué avec le nom "line.Product.ProductID". Le nom du champ ne correspond pas aux noms des paramètres de la méthode d'action "RemoveFromCart" qui attend le nom de "ProductId". Cela empêcherait les classeurs de modèle par défaut de fonctionner, de sorte que MVC Framework ne pourrait pas appeler la méthode.

* Adam Freeman (Apress - Pro ASP.Net MVC 5)

2
Ahmet Arslan