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




layout asp net mvc (4)

Je peux trouver une bonne définition de Html.HiddenFor sur MSDN, mais la seule chose que je trouve sur Html.Hidden est liée à des problèmes qu’il a rencontrés.

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


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 accepte une expression indiquant que si vous affichez une vue fortement typée, vous pouvez en tirer parti et nourrir cette méthode avec une expression lambda comme celle-ci.

o=>o.SomeProperty 

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


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 ne serait 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)


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 Html.Hidden brut 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 va casser et l'erreur sera un peu difficile à comprendre. Par contre, si vous utilisez HiddenFor , vous êtes protégé contre cela:

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

Désormais, 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 présente d'autres avantages, tels que la liste déroulante des membres après la saisie de x. .


Le Html.Hidden crée une entrée cachée Mais vous devez spécifier le nom et tous les attributs que vous voulez attribuer à ce champ et à la valeur, tandis que le Html.HiddenFor crée une entrée cachée pour l'objet que vous lui transmettez. ressemble à ca:

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

Html.HiddenFor(m => m.yourProperty)

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





html-helper