Come impostare un valore predefinito con Html.TextBoxFor?


198

Domanda semplice, se si utilizza l'Html Helper da ASP.NET MVC Framework 1, è facile impostare un valore predefinito su una casella di testo perché è presente un sovraccarico Html.TextBox(string name, object value). Quando ho provato a utilizzare il metodo Html.TextBoxFor , la mia prima ipotesi è stata quella di provare quanto segue che non ha funzionato:

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

Dovrei semplicemente attenermi a Html.TextBox (stringa, oggetto) per ora?


usa questo <%: Html.TextBoxFor (x => x.Age, new {Value = "0"})%>, apporta una piccola variazione V maiuscola in Valore.
Mohan Singh,

Risposte:


354

puoi provare questo

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

49
Curioso di sapere perché la "V" maiuscola funziona e la "v" minuscola no? Inoltre, questa soluzione ha la precedenza sul valore del modello per Age, anche se presente.
Derek Hunziker,

74
il valore con v piccola è la parola chiave per C # msdn.microsoft.com/en-us/library/x9fsa0sw.aspx . Quindi penso che sia per questo che non funziona.
Tassadaque,

3
Ha votato a favore del commento perché uno ha votato per una risposta così oscura e perspicace sembrava ... inadeguata.
ehdv,

9
È ancora curioso che @value non funzioni. readonly è anche una parola chiave per C # ma @readonly funziona senza problemi.
Diego,

16
La fonte html nel browser è <input Value = "0" id = "Age" name = "Age" type = "text" value = "" /> quando si utilizza @Value. Nel tag di input sono presenti "Valore" con "0" e "Valore" con "".
Ricky,

59

Questo dovrebbe funzionare per MVC3 e MVC4

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

Se vuoi che sia un campo nascosto

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

21
Per i campi nascosti, basta usare @ Html.HiddenFor (m => m.Age, new {@Value = "12"})
Buginator,

buono @ Html.HiddenFor (m => m.Age, nuovo {@Value = "12"}) non funzionante
RollerCosta

E perché dovresti nascondere un valore predefinito codificato come questo? non senso
Antoine Pelletier,

31

Si scopre che se non si specifica il modello al metodo View nel controller, non crea un oggetto con i valori predefiniti.

[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");
}

Più probabilmente si tratta di bug o funzionalità MVC, dal momento che Html.PasswordFor (m => m.Password, il nuovo {class = "form-control", value = "default" è reso quasi nello stesso html e il "default" va per valutare la corretta visualizzazione. Ad esempio, value = Model.Email funziona, ma value = ViewBag.Email funziona. Quindi questa risposta accettata è migliore e più pulita, non così hacking.
ZZZ,

Che cosa è Instructor?
Csaba Toth,

20

Il valore predefinito sarà il valore della tua Model.Ageproprietà. Questo è un po 'il punto.


3
Sembra una cattiva idea quando il modello gestisce i valori predefiniti. Cosa si deve fare quando è necessario un valore predefinito diverso per la stessa raccolta di elementi del modello?
RredCat,

@RredCat D'accordo, questo confonde la separazione del livello dell'interfaccia utente
Evan M,

18

Puoi semplicemente fare:

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

o meglio, questo passerà al valore predefinito '0' se il modello è null, ad esempio se si ha la stessa vista sia per la modifica che per la creazione:

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

11

value = "0" imposterà il valore predefinito per @ Html.TextBoxfor

la "v" sensibile al maiuscolo / minuscolo dovrebbe essere maiuscola

Di seguito è riportato un esempio funzionante:

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

9

Ecco come l'ho risolto. Funziona se lo usi anche per la modifica.

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

se Age è null .. otterrai un'eccezione puntatore null perché il ?? tenterà di verificare il ritorno di ToString ().
eaglei22

@ eaglei22 Nullable <T> .ToString () restituirà una stringa vuota se il valore è null.
Tom Lint

grazie per aver mostrato come modellare il binding in un oggetto anonimo
nulla il

9

Questo lavoro per me

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

+1 per il parametro indicato che è particolarmente utile nel codice copia / pastable e uno che utilizza un metodo con molti sovraccarichi
Ekus

8

L'utilizzo @Valueè un hack, perché genera due attributi, ad esempio:

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

Dovresti farlo invece:

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

7

questo ha funzionato per me, in questo modo abbiamo impostato il valore predefinito su stringa vuota

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

2
Sebbene questo codice possa rispondere alla domanda, sarebbe meglio includere un certo contesto, spiegando come funziona e quando usarlo. Le risposte di solo codice non sono utili a lungo termine.
Bono,

@Bono ha aggiunto alcuni commenti
eric_eri,

5

Se si dispone di un modulo di pagina parziale sia per la modifica che per l'aggiunta, il trucco che utilizzo per il valore predefinito 0è quello di effettuare le seguenti operazioni:

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

In questo modo sarà 0se non impostato o l'età effettiva se esiste.


1
Se Age è un int, non funzionerà; Dovrebbe essere un int nullable.
Justin Self,

0

Prova anche questo, ovvero rimuovi il nuovo {} e sostituiscilo con una stringa.

<%: Html.TextBoxFor(x => x.Age,"0") %>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.