我创建了一个EF4.1代码优先模型(可能重要也可能不重要),我正在尝试获取Create scaffold模板的默认值。我的模型看起来像:
class Person {
[DefaultValue (18)]
public int Age { get; set; }
}
然后我的创建视图看起来像:
<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>
我希望在运行时,EditorFor会用“18”预先填充文本框,但它没有这样的东西。我误解了DefaultValue属性的用途,还是我应该做的其他事情?
注意:我不想在EditorFor方法上使用new { Value = "18" }
覆盖,它似乎会破坏DRY。
答案 0 :(得分:33)
我不知道这是否能满足您的DRY需求,但我认为这是一个开始。
我会像这样重做模型:
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; }
}
}
保持视图不变,但在创建操作中执行以下操作:
public ActionResult Create() {
return View(new Person());
}
这样,输入文本框将使用默认的Age值创建,并且只有一个地方将指定默认值。
答案 1 :(得分:7)
class Person {
public Person() {
Age = 18;
}
public int Age { get; set; }
}
在这种情况下,每次执行新的Person年龄时,将使用18作为年龄进行初始化,即使模型Binder创建了新对象。
答案 2 :(得分:1)
模型
class Person {
public Person() {
Age = 18;
}
public int Age { get; set; }
}
控制器
public ActionResult Create() {
return View(new Person());
}
工作正常。
答案 3 :(得分:1)
假设您的视图具有以下定义: -
@model Person
并且您的控制器HTML GET返回一个空视图
return View();
然后只需添加一个可以呈现的包含默认值的类
return View(new Person{ Age = 18 });
另一种选择是向Person类添加一个单独的静态助手,返回一个默认的填充类
static public Person GetDefaultNew()
{
return new Person{ Age = 18 };
}
然后你需要
return View(new Person.GetDefaultNew());
答案 4 :(得分:0)
设置JSON.net的DefaultValueHandling参数可使DefaultValue工作:
class Person {
[JsonProperty("Age", DefaultValueHandling = DefaultValueHandling.IgnoreAndPopulate)]
[DefaultValue(18)]
public int Age { get; set; }
}