HTML.HiddenFor value set
@Html.HiddenFor(model => model.title, new { id= "natureOfVisitField", @value = '@Model.title'})
il doesen " de travail! comment définir la valeur?
6 réponses
Vous ne devriez pas 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" })
Pour le réglage de la valeur dans le champ caché le faire de la façon suivante:
@Html.HiddenFor(model => model.title,
new { id= "natureOfVisitField", Value = @Model.title})
Il
étrange mais, essayez avec @Value, capital "V"
par exemple (travail sur MVC4)
@Html.HiddenFor(m => m.Id, new { @Value = Model.Id })
mise à Jour:
J'ai trouvé que @Value (capital V) crée un autre attribut avec "Value" et "value", l'utilisation de small @value semble fonctionner aussi!
besoin de vérifier le code source MVC pour en trouver plus.
mise à Jour, Après être passé par la façon dont il fonctionne en interne:
tout d'Abord oublier tous les ces solutions de travail (j'ai gardé dans pour le plaisir de la continuité ici), semble maintenant stupide :)
fondamentalement, cela se produit quand un modèle est affiché et que le modèle est retourné à la même page.
la valeur est accessible (et formée en html) dans la méthode InputHelper (InputExtensions.cs) en utilisant le fragment de code suivant
string attemptedValue = (string)htmlHelper.GetModelStateValue(fullName, typeof(string));
la méthode GetModelStateValue (en Htmlelper.cs) récupère la valeur
ViewData.ModelState.TryGetValue(key, out modelState)
voici le problème, puisque la valeur est consulté à partir de ViewData.ModelState dictionnaire. Cela renvoie la valeur affichée à partir de la page au lieu de la valeur modifiée!!
i.e. si votre valeur affichée de la variable (par exemple personne.Id) est 0 mais vous définissez la valeur à l'intérieur de l'action httpPost (par exemple Person.Id = 2), Le ModelState conserve toujours l'ancienne valeur " 0 " et le attemptedValue contient "0" ! ainsi le champ dans la page rendue contiendra "0" comme valeur!!
solution de contournement si vous retournez le modèle à la même page : Effacer L'article de ModelState, par exemple ModelState.Supprimer ("Id");
ceci supprimera l'article du dictionnaire et le ViewData.ModelState.TryGetValue(clé, modelState) renvoie la valeur null, et la déclaration suivante (inside InputExtensions.cs) prend la valeur réelle (valueParameter) passé à HiddenFor (m => M. Id)
ceci est fait dans la ligne suivante dans les intensités InputExtensions.cs
tagBuilder.MergeAttribute("value", attemptedValue ?? ((useViewData) ? htmlHelper.EvalString(fullName, format) : valueParameter), isExplicitValue);
Résumé: Effacer l'article dans ModelState utilise ModelState.Supprimer."(..");
J'espère que c'est utile.
C'est juste de la Valeur, pas @valeur.. Essayer. Je ne suis pas sûr pour @Model.le titre, peut-être que c'est juste un modèle.titre
nécrose de 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. J'ai juste fini par faire une belle extension de la méthode:
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);
}
utiliser comme suit:
@Html.HiddenFor(m => m.RELATED_ID, Related.Id)
notez que ceci a une signature similaire à la HiddenFor intégrée, mais utilise le typage générique, donc si la valeur est de type Système.Objet, vous invoquerez en fait celui construit dans le cadre. Je ne sais pas pourquoi vous éditeriez une propriété de type Système.Objet de votre point de vue...
le symbole @ lorsque vous spécifiez HtmlAttributes est utilisé lorsque la "chose" que vous essayez de définir est un mot-clé c#. Par exemple, la classe word, vous ne pouvez pas spécifier la classe, vous devez utiliser @class.