Como definir um valor padrão com Html.TextBoxFor?

198

Pergunta simples: se você usar o Html Helper do ASP.NET MVC Framework 1, é fácil definir um valor padrão em uma caixa de texto, pois há uma sobrecarga Html.TextBox(string name, object value). Quando tentei usar o método Html.TextBoxFor , meu primeiro palpite foi tentar o seguinte que não funcionou:

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

Devo apenas ficar com Html.TextBox (string, objeto) por enquanto?

compilado
fonte
use isso <%: Html.TextBoxFor (x => x.Age, novo {Value = "0"})%>, faça uma pequena alteração em V em valor.
Mohan Singh

Respostas:

354

você pode tentar isso

<%= Html.TextBoxFor(x => x.Age, new { @Value = "0"}) %>
Tassadaque
fonte
49
Curioso para saber por que o capital 'V' funciona e o minúsculo 'v' não? Além disso, esta solução substitui o valor do modelo para Age, mesmo se houver um.
Derek Hunziker
74
valor com pequeno v é a palavra-chave para C # msdn.microsoft.com/en-us/library/x9fsa0sw.aspx . Então eu acho que é por isso que não funciona.
Tassadaque 2/09/10
3
Votou o comentário porque um voto positivo por uma resposta tão obscura e perspicaz parecia ... inadequado.
ehdv
9
Ainda é curioso que @value não funcione. readonly também é uma palavra-chave para C #, mas @readonly funciona sem problemas.
30511 Diego
16
A fonte html no navegador é <input Value = "0" id = "Age" name = "Age" type = "text" value = "" /> ao usar @Value. Existem "Valor" com "0" e "valor" com "" na tag de entrada.
Ricky
59

Isso deve funcionar para MVC3 e MVC4

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

Se você deseja que seja um campo oculto

 @Html.TextBoxFor(m => m.Age, new { @Value = "12",@type="hidden" }) 
Gokul
fonte
21
Para campos ocultos, basta usar @ Html.HiddenFor (m => m.Age, new {@Value = "12"})
Buginator:
boa @ Html.HiddenFor (m => m.Age, new {@value = "12"}) não wokring
RollerCosta
E por que você ocultaria um valor padrão codificado como este? não-senso
Antoine Pelletier
31

Acontece que, se você não especificar o método Model para o View no seu controlador, ele não criará um objeto para você com os valores padrão.

[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");
}
compilado
fonte
É mais provável que seja um bug ou recurso do MVC, pois Html.PasswordFor (m => m.Password, new {class = "form-control", value = "default" é renderizado quase no mesmo html e o "default" continua para valor ser exibido com êxito.Por exemplo, value = Model.Email funciona, mas value = ViewBag.Email funciona.Então, essa resposta aceita é melhor e mais limpa, e não tão invasiva. '
ZZZ

O que é Instructor?
Csaba Toth

20

O valor padrão será o valor da sua Model.Agepropriedade. Esse é o tipo de questão.


3
Parece uma má ideia quando o modelo gerencia valores padrão. O que deve ser feito quando diferentes valores padrão precisam da mesma coleção de itens de modelo?
RredCat

@RredCat De acordo, esta turva a separação da camada de interface
Evan H

18

Você pode simplesmente fazer:

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

ou melhor, isso mudará para o valor padrão '0' se o modelo for nulo, por exemplo, se você tiver a mesma visualização para editar e criar:

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

11

value = "0" definirá o valor padrão para @ Html.TextBoxfor

seu caso "v" deve ser maiúsculo

Abaixo está um exemplo de trabalho:

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

9

Aqui está como eu resolvi isso. Isso funciona se você também usar isso para edição.

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

se a idade for nula .. você receberá uma exceção de ponteiro nulo porque o ?? vai tentar verificar o retorno do ToString ().
precisa saber é o seguinte

@ eaglei22 Anulável <T> .ToString () retornará uma string vazia se o valor for nulo.
Tom Lint

obrigado por mostrar como modelar bind em um objeto anônimo
nada

9

Esse trabalho pra mim

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

+1 para o parâmetro nomeado que é especialmente útil em cópia código / colável e um que usa um método com muitos sobrecargas
Ekus

8

Usar @Valueé um hack, porque gera dois atributos, por exemplo:

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

Você deve fazer isso:

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

7

isso funcionou para mim, dessa forma, definimos o valor padrão como string vazia

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

2
Embora esse código possa responder à pergunta, seria melhor incluir algum contexto, explicando como ele funciona e quando usá-lo. Respostas somente de código não são úteis a longo prazo.
Bono

@Bono adicionou alguns comentários
eric_eri

5

Se você tiver um formulário de página parcial para editar e adicionar, o truque que utilizo como valor padrão 0é o seguinte:

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

Dessa forma, será não 0definido ou a idade real, se existir.


1
Se Age for int, isso não funcionará; Teria de ser um int nulo.
23613 Justin

0

Tente isso também, ou seja, remova o novo {} e substitua-o por string.

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