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?.
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.
.
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!
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.
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.
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)