Comment définir une valeur par défaut avec Html.TextBoxFor?

198

Question simple, si vous utilisez l'aide HTML de ASP.NET MVC Framework 1, il est facile de définir une valeur par défaut sur une zone de texte en raison d'une surcharge Html.TextBox(string name, object value). Lorsque j'ai essayé d'utiliser la méthode Html.TextBoxFor , ma première supposition a été d'essayer ce qui n'a pas fonctionné:

<%: Html.TextBoxFor(x => x.Age, new { value = "0"}) %>

Dois-je rester avec Html.TextBox (chaîne, objet) pour l'instant?

décompilé
la source
utilisez ce <%: Html.TextBoxFor (x => x.Age, new {Value = "0"})%>, effectuez une petite modification du capital V dans Value.
Mohan Singh

Réponses:

354

tu peux essayer ça

<%= Html.TextBoxFor(x => x.Age, new { @Value = "0"}) %>
Tassadaque
la source
49
Curieux de savoir pourquoi le «V» majuscule fonctionne et le «V» minuscule ne fonctionne pas? En outre, cette solution remplace la valeur du modèle pour Age, même si une est présente.
Derek Hunziker
74
la valeur avec un petit v est le mot clé pour C # msdn.microsoft.com/en-us/library/x9fsa0sw.aspx . Je pense donc que c'est pourquoi cela ne fonctionne pas.
Tassadaque
3
A voté pour le commentaire car un vote positif pour une réponse aussi obscure et perspicace semblait ... insuffisant.
ehdv
9
Il est toujours curieux que @value ne fonctionne pas. readonly est également un mot clé pour C # mais @readonly fonctionne sans aucun problème.
Diego
16
La source html dans le navigateur est <input Value = "0" id = "Age" name = "Age" type = "text" value = "" /> lors de l'utilisation de @Value. Il y a à la fois "Value" avec "0" et "value" avec "" dans la balise d'entrée.
Ricky
59

Cela devrait fonctionner pour MVC3 et MVC4

 @Html.TextBoxFor(m => m.Age, new { @Value = "12" }) 

Si vous voulez que ce soit un champ caché

 @Html.TextBoxFor(m => m.Age, new { @Value = "12",@type="hidden" }) 
Gokul
la source
21
Pour les champs cachés, utilisez simplement @ Html.HiddenFor (m => m.Age, new {@Value = "12"})
Buginator
bon @ Html.HiddenFor (m => m.Age, nouveau {@Value = "12"}) pas wokring
RollerCosta
Et pourquoi cacheriez-vous une valeur par défaut codée en dur comme celle-ci? non sens
Antoine Pelletier
31

Il s'avère que si vous ne spécifiez pas le modèle à la méthode View dans votre contrôleur, il ne crée pas d'objet pour vous avec les valeurs par défaut.

[AcceptVerbs(HttpVerbs.Get)]
public ViewResult Create()
{
  // Loads default values
  Instructor i = new Instructor();
  return View("Create", i);
}

[AcceptVerbs(HttpVerbs.Get)]
public ViewResult Create()
{
  // Does not load default values from instructor
  return View("Create");
}
décompilé
la source
Il s'agit plus probablement d'un bogue ou d'une fonctionnalité MVC, car Html.PasswordFor (m => m.Password, new {class = "form-control", value = "default" est rendu dans presque le même html, et le "default" go pour que la valeur soit affichée avec succès. Par exemple, value = Model.Email fonctionne, mais value = ViewBag.Email fonctionne. Cette réponse acceptée est donc meilleure et plus propre, pas si piratée.
ZZZ

Qu'est-ce que c'est Instructor?
Csaba Toth

20

La valeur par défaut sera la valeur de votre Model.Agepropriété. C'est un peu l'essentiel.


3
Semble que c'est une mauvaise idée lorsque le modèle gère les valeurs par défaut. Que faire lorsque différentes valeurs par défaut ont besoin pour la même collection d'éléments de modèle?
RredCat

@RredCat D'accord, cela brouille la séparation de la couche d'interface utilisateur
Evan M

18

Vous pouvez simplement faire:

<%= Html.TextBoxFor(x => x.Age, new { @Value = "0"}) %>

ou mieux, cela passera à la valeur par défaut «0» si le modèle est nul, par exemple si vous avez la même vue pour l'édition et la création:

@Html.TextBoxFor(x => x.Age, new { @Value = (Model==null) ? "0" : Model.Age.ToString() })

11

value = "0" définira la valeur par défaut pour @ Html.TextBoxfor

son "v" sensible à la casse doit être majuscule

Voici un exemple de travail:

@Html.TextBoxFor(m => m.Nights, 
    new { @min = "1", @max = "10", @type = "number", @id = "Nights", @name = "Nights", Value = "1" })

9

Voici comment je l'ai résolu. Cela fonctionne si vous l'utilisez également pour l'édition.

@Html.TextBoxFor(m => m.Age, new { Value = Model.Age.ToString() ?? "0" })

si l'âge est nul .. vous allez obtenir une exception de pointeur nul parce que le ?? va essayer de vérifier le retour de la ToString ().
eaglei22

@ eaglei22 Nullable <T> .ToString () renverra une chaîne vide si la valeur est nulle.
Tom Lint

merci d'avoir montré comment modéliser la reliure dans un objet anonyme
rien

9

Ce travail pour moi

@Html.TextBoxFor(model => model.Age, htmlAttributes: new { @Value = "" })

+1 pour le paramètre nommé qui est particulièrement utile dans le code copier / coller et celui qui utilise une méthode avec de nombreuses surcharges
Ekus

8

L'utilisation @Valueest un hack, car elle génère deux attributs, par exemple:

<input type="..." Value="foo" value=""/>

Vous devriez le faire à la place:

@Html.TextBox(Html.NameFor(p => p.FirstName).ToString(), "foo")

7

cela a fonctionné pour moi, de cette façon, nous définissons la valeur par défaut sur une chaîne vide

@Html.TextBoxFor(m => m.Id, new { @Value = "" })

2
Bien que ce code puisse répondre à la question, il serait préférable d'inclure un certain contexte, expliquant comment il fonctionne et quand l'utiliser. Les réponses uniquement codées ne sont pas utiles à long terme.
Bono

@Bono a ajouté quelques commentaires
eric_eri

5

Si vous avez un formulaire de page partiel pour l'édition et l'ajout, l'astuce que j'utilise pour la valeur par défaut 0est de faire ce qui suit:

@Html.TextBox("Age", Model.Age ?? 0)

De cette façon, ce sera 0s'il n'est pas réglé ou l'âge réel s'il existe.


1
Si Age est un int, cela ne fonctionnera pas; Il faudrait que ce soit un entier nullable.
Justin Self

0

Essayez également ceci, c'est-à-dire supprimer le nouveau {} et le remplacer par une chaîne.

<%: Html.TextBoxFor(x => x.Age,"0") %>
Hammad Khan