web-dev-qa-db-fra.com

Valeur par défaut dans un modèle de vue asp.net mvc

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>
}
58
Shawn Mclean

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());
}
114
Dismissile

Créez une classe de base pour votre ViewModels avec le code constructeur suivant qui appliquera la DefaultValueAttributeslorsque 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; }
}
15
CodeGrue

Utilisez une valeur spécifique:

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

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" })
0
Oleksii Aza

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.

0
user338195

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());
0
Juanse Albuja