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.