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.
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.
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.
Modèle
class Person {
public Person() {
Age = 18;
}
public int Age { get; set; }
}
Manette
public ActionResult Create() {
return View(new Person());
}
Ça fonctionne bien.
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());
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; }
}