web-dev-qa-db-fra.com

Annotation de propriétés sur un modèle avec des valeurs par défaut

J'ai créé un modèle EF4.1 code-first (peut ou peut ne pas être important), et j'essaie d'obtenir des valeurs par défaut pour mon modèle d'échafaudage Créer. Mon modèle ressemble à:

class Person {
    [DefaultValue (18)]
    public int Age { get; set; }
}

Et puis ma vue Créer ressemble à ceci:

<div class="editor-label">
    @Html.LabelFor(model => model.Age)
</div>
<div class="editor-field">
    @Html.EditorFor(model => model.Age)
    @Html.ValidationMessageFor(model => model.Age)
</div>

Je m'attendrais à l'exécution, que le EditorFor préremplirait la zone de texte avec "18", mais cela ne fait rien de tel. Suis-je en train de mal comprendre à quoi sert l'attribut DefaultValue ou y a-t-il autre chose que je devrais faire?

Remarque: je ne veux pas utiliser le new { Value = "18" } remplacer la méthode EditorFor, il semble casser DRY.

26
Bryan Boettcher

Je ne sais pas si cela répondra à vos besoins DRY, mais c'est un début je pense.

Je retravaillerais le modèle un peu comme ceci:

public class Person {
    private const int DEFAULT_AGE = 18;
    private int _age = DEFAULT_AGE;
    [DefaultValue(DEFAULT_AGE)]
    public int Age {
        get { return _age; }
        set { _age = value; }
    }
}

Conservez la vue telle quelle, mais dans l'action de création, procédez comme suit:

public ActionResult Create() {
    return View(new Person());
}

De cette façon, la zone de texte d'entrée sera créée avec la valeur d'âge par défaut, et il n'y aura qu'un seul endroit où cette valeur par défaut sera spécifiée.

33
Kenji Kina
class Person {
    public Person() {
        Age = 18;    
    }
    public int Age { get; set; }
}

Dans ce scénario, chaque fois que vous effectuez un nouvel âge de personne sera initialisé avec 18 comme âge, même lorsque le nouvel objet est créé par le classeur de modèles.

7
Bart Calixto

Modèle

class Person {
    public Person() {
        Age = 18;    
    }
    public int Age { get; set; }
}

Manette

public ActionResult Create() {
    return View(new Person());
}

Ça fonctionne bien.

1
Danial

En supposant que votre vue ait une définition telle que: -

@model Person

et vos contrôleurs HTML GET renvoie une vue vide

return View();

Ensuite, ajoutez simplement une classe pouvant être rendue contenant des valeurs par défaut

return View(new Person{ Age = 18 });

Une autre option consiste à ajouter un assistant statique singleton à votre classe Person qui renvoie une classe remplie par défaut

  static public Person GetDefaultNew()
        {
            return new Person{ Age = 18 };
        }

Ensuite, vous avez besoin

return View(new Person.GetDefaultNew());
1
pixelda

La définition du paramètre DefaultValueHandling de JSON.net permet à DefaultValue de fonctionner:

class Person {
    [JsonProperty("Age", DefaultValueHandling = DefaultValueHandling.IgnoreAndPopulate)]
    [DefaultValue(18)]
    public int Age { get; set; }
}
0
vcliment89