¿Cómo establecer un valor predeterminado con Html.TextBoxFor?

198

Pregunta simple, si usa el Ayudante HTML de ASP.NET MVC Framework 1, es fácil establecer un valor predeterminado en un cuadro de texto porque hay una sobrecarga Html.TextBox(string name, object value). Cuando intenté usar el método Html.TextBoxFor , mi primera suposición fue probar lo siguiente que no funcionó:

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

¿Debo seguir con Html.TextBox (cadena, objeto) por ahora?

dcompilado
fuente
use esto <%: Html.TextBoxFor (x => x.Age, new {Value = "0"})%>, haga un pequeño cambio de V capital en Value.
Mohan Singh

Respuestas:

354

puedes probar esto

<%= Html.TextBoxFor(x => x.Age, new { @Value = "0"}) %>
Tassadaque
fuente
49
¿Tienes curiosidad por saber por qué la 'V' mayúscula funciona y la 'v' minúscula no? Además, esta solución anula el valor del modelo para Age, incluso si hay uno presente.
Derek Hunziker
74
El valor con v pequeño es la palabra clave para C # msdn.microsoft.com/en-us/library/x9fsa0sw.aspx . Así que creo que por eso no funciona.
Tassadaque
3
Votó el comentario porque una votación positiva por una respuesta tan oscura y perspicaz parecía ... inadecuada.
ehdv
9
Todavía es curioso que @value no funcione. readonly también es una palabra clave para C # pero @readonly funciona sin problemas.
Diego
16
La fuente html en el navegador es <input Value = "0" id = "Age" name = "Age" type = "text" value = "" /> cuando se utiliza @Value. Hay "Valor" con "0" y "valor" con "" en la etiqueta de entrada.
Ricky
59

Esto debería funcionar para MVC3 y MVC4

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

Si quieres que sea un campo oculto

 @Html.TextBoxFor(m => m.Age, new { @Value = "12",@type="hidden" }) 
Gokul
fuente
21
Para campos ocultos, solo use @ Html.HiddenFor (m => m.Age, new {@Value = "12"})
Buginator
good one @ Html.HiddenFor (m => m.Age, new {@Value = "12"}) wokring
RollerCosta
¿Y por qué escondería un valor predeterminado codificado como este? sin sentido
Antoine Pelletier
31

Resulta que si no especifica el Modelo al método Ver dentro de su controlador, no crea un objeto para usted con los valores predeterminados.

[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");
}
dcompilado
fuente
Es más probable que sea un error o característica MVC, ya que Html.PasswordFor (m => m.Password, new {class = "form-control", value = "default" se representa en casi el mismo html, y el "default" va para que el valor se muestre correctamente. Por ejemplo, value = Model.Email funciona, pero value = ViewBag.Email funciona. Por lo tanto, esta respuesta aceptada es mejor y más limpia, no tan pirateo.
ZZZ

¿Qué es Instructor?
Csaba Toth

20

El valor predeterminado será el valor de su Model.Agepropiedad. Eso es una especie de punto completo.


3
Parece que es una mala idea cuando el modelo gestiona los valores predeterminados. ¿Qué se debe hacer cuando se necesita un valor predeterminado diferente para la misma colección de elementos del modelo?
RredCat

@RredCat De acuerdo, esto enturbia la separación de la capa de interfaz de usuario
Evan M

18

Simplemente puedes hacer:

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

o mejor, esto cambiará al valor predeterminado '0' si el modelo es nulo, por ejemplo, si tiene la misma vista para editar y crear:

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

11

value = "0" establecerá el valor de defualt para @ Html.TextBoxfor

su "v" sensible a mayúsculas y minúsculas debería ser mayúscula

A continuación se muestra un ejemplo de trabajo:

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

9

Así es como lo resolví. Esto funciona si también lo usa para editar.

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

si la edad es nula ... obtendrá una excepción de puntero nulo porque intentará verificar el retorno de ToString ().
eaglei22

@ eaglei22 Nullable <T> .ToString () devolverá una cadena vacía si el valor es nulo.
Tom Lint

gracias por mostrar cómo modelar el enlace en un objeto anónimo
nada

9

Este trabajo para mi

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

+1 para el parámetro con nombre que es especialmente útil en el código de copia / pegado y uno que utiliza un método con muchas sobrecargas
Ekus

8

Usar @Valuees un hack, porque genera dos atributos, por ejemplo:

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

Deberías hacer esto en su lugar:

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

7

esto funcionó para mí, de esta manera configuramos el valor predeterminado para vaciar la cadena

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

2
Si bien este código puede responder la pregunta, sería mejor incluir algo de contexto, explicando cómo funciona y cuándo usarlo. Las respuestas de solo código no son útiles a largo plazo.
Bono

@Bono agregó algunos comentarios
eric_eri

5

Si tiene un formulario de página parcial para editar y agregar, entonces el truco que utilizo para el valor predeterminado 0es hacer lo siguiente:

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

Así será 0si no está establecido o la edad real si existe.


1
Si Age es un int, eso no funcionará; Tendría que ser un int anulable.
Justin Self

0

Pruebe esto también, es decir, elimine el nuevo {} y reemplácelo con una cadena.

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