type textboxfor mvc for asp.net-mvc asp.net-mvc-3

asp.net-mvc - mvc - textboxfor type



Valor predeterminado en un modelo de vista asp.net mvc (6)

Tengo este modelo:

public class SearchModel { [DefaultValue(true)] public bool IsMale { get; set; } [DefaultValue(true)] public bool IsFemale { get; set; } }

Pero basado en mi investigación y respuestas aquí, DefaultValueAttribute realidad no establece un valor predeterminado. Pero esas respuestas fueron de 2008, ¿hay algún atributo o una mejor manera que usar un campo privado para establecer estos valores en verdadero cuando se pasan a la vista?

Aquí está la vista de todos modos:

@using (Html.BeginForm("Search", "Users", FormMethod.Get)) { <div> @Html.LabelFor(m => Model.IsMale) @Html.CheckBoxFor(m => Model.IsMale) <input type="submit" value="search"/> </div> }


¿Qué tendrías? Probablemente terminará con una búsqueda predeterminada y una búsqueda que cargue desde algún lugar. La búsqueda predeterminada requiere un constructor predeterminado, por lo que debe hacer que uno como Dismissile ya haya sugerido.

Si carga los criterios de búsqueda de otra parte, probablemente debería tener alguna lógica de mapeo.


Cree una clase base para su ViewModels con el siguiente código de constructor que aplicará DefaultValueAttributes cuando se DefaultValueAttributes cualquier modelo heredado.

public abstract class BaseViewModel { protected BaseViewModel() { // apply any DefaultValueAttribute settings to their properties var propertyInfos = this.GetType().GetProperties(); foreach (var propertyInfo in propertyInfos) { var attributes = propertyInfo.GetCustomAttributes(typeof(DefaultValueAttribute), true); if (attributes.Any()) { var attribute = (DefaultValueAttribute) attributes[0]; propertyInfo.SetValue(this, attribute.Value, null); } } } }

Y herede esto en su ViewModels:

public class SearchModel : BaseViewModel { [DefaultValue(true)] public bool IsMale { get; set; } [DefaultValue(true)] public bool IsFemale { get; set; } }


En caso de que necesite publicar el mismo modelo en el servidor, la solución con un valor de bool predeterminado en el constructor no sería viable para usted. Imaginemos que tiene el siguiente modelo:

public class SearchModel { public bool IsMale { get; set; } public SearchModel() { IsMale = true; } }

A la vista, tendrías algo como esto:

@Html.CheckBoxFor(n => n.IsMale)

El problema es cuando el usuario desmarcar esta casilla de verificación y publicarlo en el servidor - terminaría con el valor predeterminado configurado en el constructor (que en este caso es verdadero).

Entonces, en este caso, terminaría simplemente especificando el valor predeterminado en la vista:

@Html.CheckBoxFor(n => n.IsMale, new { @checked = "checked" })


Establecer esto en el constructor:

public class SearchModel { public bool IsMale { get; set; } public bool IsFemale { get; set; } public SearchModel() { IsMale = true; IsFemale = true; } }

Luego, páselo a la vista en tu acción GET:

[HttpGet] public ActionResult Search() { return new View(new SearchModel()); }


Solo quería comentar la respuesta de @Desmitsile, ya que no puedo editar su respuesta ni agregarle un comentario para señalar que la llamada al constructor View new dará como resultado un error (probado en Visual Studio 2015), que tiene sentido ya que están generando una instancia del modelo, y no de la clase View. La línea correcta de código sería:

return View(new SearchModel());


Use un valor específico:

[Display(Name = "Date")] public DateTime EntryDate {get; set;} = DateTime.Now;//by C# v6