J'ai ce modèle:
public class SearchModel
{
[DefaultValue(true)]
public bool IsMale { get; set; }
[DefaultValue(true)]
public bool IsFemale { get; set; }
}
Mais sur la base de mes recherches et réponses ici, DefaultValueAttribute
ne définit pas réellement de valeur par défaut. Mais ces réponses dataient de 2008. Existe-t-il un attribut ou un meilleur moyen que d’utiliser un champ privé pour définir ces valeurs sur true lorsqu’il est transmis à la vue?
Heres la vue quand même:
@using (Html.BeginForm("Search", "Users", FormMethod.Get))
{
<div>
@Html.LabelFor(m => Model.IsMale)
@Html.CheckBoxFor(m => Model.IsMale)
<input type="submit" value="search"/>
</div>
}
Définissez ceci dans le constructeur:
public class SearchModel
{
public bool IsMale { get; set; }
public bool IsFemale { get; set; }
public SearchModel()
{
IsMale = true;
IsFemale = true;
}
}
Puis passez-le à la vue dans votre action GET:
[HttpGet]
public ActionResult Search()
{
return new View(new SearchModel());
}
Créez une classe de base pour votre ViewModels
avec le code constructeur suivant qui appliquera la DefaultValueAttributes
lorsque tout modèle héritant est créé.
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);
}
}
}
}
Et héritez de cela dans vos ViewModels:
public class SearchModel : BaseViewModel
{
[DefaultValue(true)]
public bool IsMale { get; set; }
[DefaultValue(true)]
public bool IsFemale { get; set; }
}
Utilisez une valeur spécifique:
[Display(Name = "Date")]
public DateTime EntryDate {get; set;} = DateTime.Now;//by C# v6
Si vous devez publier le même modèle sur le serveur, la solution avec la valeur par défaut bool
dans le constructeur ne serait pas viable pour vous. Imaginons que vous ayez le modèle suivant:
public class SearchModel
{
public bool IsMale { get; set; }
public SearchModel()
{
IsMale = true;
}
}
Sur la vue, vous auriez quelque chose comme ça:
@Html.CheckBoxFor(n => n.IsMale)
Le problème est que lorsque l'utilisateur décoche cette case et l'envoie au serveur, vous obtiendrez une valeur par défaut dans le constructeur (ce qui dans ce cas est vrai).
Donc dans ce cas, je me contenterais de spécifier la valeur par défaut:
@Html.CheckBoxFor(n => n.IsMale, new { @checked = "checked" })
Qu'auras-tu? Vous allez probablement vous retrouver avec une recherche par défaut et une recherche que vous chargez quelque part. La recherche par défaut nécessite un constructeur par défaut, alors créez-en un comme Dismissile l'a déjà suggéré.
Si vous chargez les critères de recherche ailleurs, vous devriez probablement avoir une logique de mappage.
Je voulais juste faire une remarque sur la réponse de @ Dismissile, car je ne peux ni l'éditer, ni y ajouter un commentaire pour indiquer que l'appel du constructeur de View, new
, entraînera une erreur (testée sur Visual Studio 2015), ce qui est logique ne font que créer une instance du modèle et non de la classe View. La bonne ligne de code serait:
return View(new SearchModel());