I created an EF4.1 code-first model (may or may not be important), and I'm trying to get default values for my Create scaffold template. My model looks like:
class Person {
[DefaultValue (18)]
public int Age { get; set; }
}
And then my Create view looks like:
<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>
I would expect at runtime, that the EditorFor would pre-populate the textbox with "18", but it does no such thing. Am I misunderstanding what the DefaultValue attribute is for, or is there something else I should be doing?
Note: I don't want to use the new { Value = "18" }
override on the EditorFor method, it seems to break DRY.
I don't know if this will satisfy your DRY needs, but it's a start I think.
I would rework the model a bit like this:
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; }
}
}
Keep the view as is, but in the create action do this:
public ActionResult Create() {
return View(new Person());
}
That way, the input textbox will be created with the default Age value, and there will be only one place where that default will be specified.
class Person {
public Person() {
Age = 18;
}
public int Age { get; set; }
}
In this scenario, every time you do a new Person age will be initialized with 18 as age, even when the new object is created by the Model Binder.
Model
class Person {
public Person() {
Age = 18;
}
public int Age { get; set; }
}
Controller
public ActionResult Create() {
return View(new Person());
}
It works fine.
Assuming that your view has a definition such as:-
@model Person
and your controllers HTML GET returns an empty View
return View();
Then simply add a class that can be rendered that contains default values
return View(new Person{ Age = 18 });
Another option is to add a singleton static helper to your Person class that returns a default, populated class
static public Person GetDefaultNew()
{
return new Person{ Age = 18 };
}
Then you need
return View(new Person.GetDefaultNew());
Setting JSON.net's DefaultValueHandling parameter makes DefaultValue work:
class Person {
[JsonProperty("Age", DefaultValueHandling = DefaultValueHandling.IgnoreAndPopulate)]
[DefaultValue(18)]
public int Age { get; set; }
}