72 votes

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 d'après mes recherches et les réponses ici, DefaultValueAttribute ne définit pas réellement une valeur par défaut. Mais ces réponses datent de 2008. Existe-t-il un attribut ou un meilleur moyen que l'utilisation d'un champ privé pour définir ces valeurs à true lorsqu'elles sont transmises à la vue ?

Voici la vue en tout cas :

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

128voto

Dismissile Points 12054

Définissez-le 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());
}

0 votes

Est-ce que cela initialisera également les valeurs à la valeur que vous avez définie dans la base de données ? Ou seulement dans l'objet ?

1 votes

@Zapnologica Ceci est écrit comme un ViewModel, qui existe indépendamment du modèle soutenu par les données. En pratique, vous pourriez créer le ViewModel, et remplacer ces valeurs par défaut par des valeurs tirées d'une entrée de base de données (en utilisant le modèle adossé à des données), mais tel quel, il utilisera toujours ces valeurs par défaut. Maintenant, lorsque ces données sont soumises par le navigateur dans le cadre d'un formulaire affiché, ce que vous faites avec ces données (qu'elles soient enregistrées dans la base de données ou autre) dépend de vous.

0 votes

Cela pourrait-il fonctionner si je surcharge le constructeur avec deux paramètres et que je définisse les propriétés par défaut uniquement dans le contrôleur ?

25voto

Guruprakash Points 79

Utiliser une valeur spécifique :

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

1 votes

Il est bizarre que je ne puisse pas l'utiliser dans Asp.net core 3.1 avec C# 8. Il n'y a pas d'erreur, mais il ne fonctionne pas non plus.

17voto

CodeGrue Points 2109

Créez une classe de base pour votre ViewModels avec le code constructeur suivant qui appliquera l'option DefaultValueAttributes lorsque tout modèle hérité 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; }
}

3 votes

Bien qu'il s'agisse d'une solution intelligente, je pense qu'avec C#6, il est préférable (plus performant) d'utiliser des initialisateurs de propriétés automatiques comme ceux-ci : public bool IsMale { get; set; } = true

2voto

user14006190 Points 11
<div class="form-group">
                    <label asp-for="Password"></label>
                    <input asp-for="Password"  value="Pass@123" readonly class="form-control" />
                    <span asp-validation-for="Password" class="text-danger"></span>
                </div>

utiliser : value="Pass@123" pour la valeur par défaut en entrée dans .net core

2voto

Oleksii Aza Points 4539

Si vous avez besoin d'envoyer le même modèle au serveur, la solution avec la valeur par défaut est la suivante 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;
    }
}

A l'écran, vous auriez quelque chose comme ceci :

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

Le problème est que lorsque l'utilisateur décoche cette case et l'envoie au serveur, il se retrouve avec la valeur par défaut définie dans le constructeur (qui dans ce cas est vraie).

Dans ce cas, je me contenterais de spécifier la valeur par défaut de la vue :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X