web-dev-qa-db-fra.com

HTML.HiddenFor ensemble de valeurs

@Html.HiddenFor(model => model.title, new { id= "natureOfVisitField", @value = '@Model.title'})

ça ne marche pas! comment définir la valeur?

37
arnoldrob

Vous ne devriez pas avoir besoin de définir la valeur dans le paramètre attributs. MVC devrait automatiquement le lier pour vous.

@Html.HiddenFor(model => model.title, new { id= "natureOfVisitField" })
23
Daniel A. White

Pour définir la valeur dans un champ masqué, procédez de la manière suivante:

@Html.HiddenFor(model => model.title, 
                new { id= "natureOfVisitField", Value = @Model.title})

Ça va marcher

82
user1187093

Étrange mais, essayez avec @Value, majuscule "V"

par exemple. (travaille sur MVC4)

@Html.HiddenFor(m => m.Id, new { @Value = Model.Id })

Mettre à jour:

Découvert que @Value (majuscule V) crée un autre attribut avec "Value" avec "value", l'utilisation de small @value semble également fonctionner! 

Besoin de vérifier le code source de MVC pour trouver plus.


Mise à jour, Après avoir examiné son fonctionnement en interne:

Tout d'abord, oubliez toutes ces solutions de contournement (je les ai conservées pour des raisons de continuité ici), semble maintenant ridicule :)

En gros, cela se produit lorsqu'un modèle est publié et que le modèle est renvoyé à la même page.

La valeur est accessible (et formée en HTML) dans la méthode InputHelper (InputExtensions.cs) à l'aide du fragment de code suivant

string attemptedValue = (string)htmlHelper.GetModelStateValue(fullName, typeof(string));

La méthode GetModelStateValue (dans Htmlelper.cs) récupère la valeur en tant que

ViewData.ModelState.TryGetValue(key, out modelState)

Voici le problème, puisque la valeur est accessible à partir du dictionnaire ViewData.ModelState ..__ Ceci retourne la valeur publiée à partir de la page au lieu de la valeur modifiée !!

par exemple, si votre valeur affichée de la variable (par exemple, Person.Id) est 0 mais que vous définissez la valeur dans l'action httpPost (par exemple, Person.Id = 2), le ModelState conserve toujours l'ancienne valeur "0" et le tentéValue contient "0"! donc le champ dans la page rendue contiendra "0" comme valeur !!

Solution de contournement si vous renvoyez le modèle sur la même page: supprimez l'élément de ModelState, Ex. ModelState.Remove ("Id"); 

Cela supprimera l'élément du dictionnaire et le ViewData.ModelState.TryGetValue (key, out modelState) Renvoie null et l'instruction suivante (à l'intérieur de InputExtensions.cs) prend la valeur réelle ( valueParameter ) transmise à HiddenFor (m => m.Id)

ceci est fait dans la ligne suivante dans InputExtensions.cs

tagBuilder.MergeAttribute("value", attemptedValue ?? ((useViewData) ? htmlHelper.EvalString(fullName, format) : valueParameter), isExplicitValue);

Résumé: Supprimez l'élément dans ModelState à l'aide de ModelState.Remove ("...");

J'espère que c'est utile.

34
Tejasvi Hegde

C'est juste de la valeur, pas de la valeur @ ... Essayez-le. Je ne suis pas sûr de @ Model.title, c'est peut-être juste Model.title

10
der_chirurg

Necroing cette question parce que j'ai récemment rencontré le problème moi-même, en essayant d'ajouter une propriété liée à une entité existante. Je viens juste de faire une méthode d'extension de Nice:

    public static MvcHtmlString HiddenFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, TProperty value)
    {
        string expressionText = ExpressionHelper.GetExpressionText(expression);
        string propertyName = htmlHelper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(expressionText);

        return htmlHelper.Hidden(propertyName, value);
    }

Utilisez comme si:

@Html.HiddenFor(m => m.RELATED_ID, Related.Id)

Notez que cela a une signature similaire à celle de HiddenFor intégrée, mais utilise un typage générique. Par conséquent, si Value est de type System.Object, vous invoquerez en réalité celle intégrée dans la structure. Vous ne savez pas vraiment pourquoi vous éditeriez une propriété de type System.Object dans vos vues ...

3
Stevoman

Tu peux faire comme ça

@Html.HiddenFor(model=>model.title, new {ng_init = string.Format("model.title='{0}'", Model.title) })
0
Ali Hasan

Le symbole @ lors de la spécification de HtmlAttributes est utilisé lorsque la "chose" que vous essayez de définir est un mot clé c #. Ainsi, par exemple, la classe Word, vous ne pouvez pas spécifier de classe, vous devez utiliser @class.

0
Mike