使用默认值注释模型上的属性
Posted
技术标签:
【中文标题】使用默认值注释模型上的属性【英文标题】:Annotating properties on a model with default values 【发布时间】:2011-10-10 10:16:41 【问题描述】:我创建了一个 EF4.1 代码优先模型(可能重要也可能不重要),并且我正在尝试为我的创建脚手架模板获取默认值。我的模型看起来像:
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。
【问题讨论】:
【参考方案1】:我不知道这是否能满足您的 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 值创建,并且只有一个地方会指定默认值。
【讨论】:
我应该补充一点,我已经尝试在构造函数中设置 Age 属性,但这似乎也不起作用。 View 是对 Person 的强类型。但是,我缺少的是将一个新的 Person 传递到视图中。那就是我想要的,你的解决方案足够干燥:)(我完全省略 DefaultValue,只使用构造函数) 如何访问 DefaultValue 属性?我找不到它。 @Johannes 也许你错过了using System.ComponentModel
- msdn.microsoft.com/en-us/library/…
DefaultValue 仅适用于视图的模型绑定,但当您再次将其传递给控制器时,它不适用于构造函数。如果未传递任何年龄,则它将为 null 而不是默认值。您必须有一个构造函数才能同时工作。
请注意,代码优先迁移不会获取这些默认值。您需要在定义可以传递 defaultValue 参数的类型的调用中手动将它们添加到迁移脚本中。见***.com/a/13953246/70182【参考方案2】:
class Person
public Person()
Age = 18;
public int Age get; set;
在这种情况下,每次你做一个新的人年龄都会被初始化为 18 作为年龄,即使新对象是由模型绑定器创建的。
【讨论】:
【参考方案3】:型号
class Person
public Person()
Age = 18;
public int Age get; set;
控制器
public ActionResult Create()
return View(new Person());
效果很好。
【讨论】:
【参考方案4】:假设你的视图有如下定义:-
@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());
【讨论】:
你不需要更新 GetDefaultNew() 的返回值,但我知道你要去哪里。在最初的问题中,我只是忘记传递模型的任何实例。 为了扩展我的答案,我想说创建自己的“ViewModel”类是值得的,它包含视图所需的所有实例数据。这使控制器保持苗条,您的模型及其注释,以及您的视图模型类与业务规则和其他选项(例如设置默认业务值 - 如果不引用您还将在视图模型)用于相关视图。它还使您的视图模型具有高度可测试性,并使视图尽可能简单【参考方案5】:设置 JSON.net 的 DefaultValueHandling 参数使 DefaultValue 起作用:
class Person
[JsonProperty("Age", DefaultValueHandling = DefaultValueHandling.IgnoreAndPopulate)]
[DefaultValue(18)]
public int Age get; set;
【讨论】:
以上是关于使用默认值注释模型上的属性的主要内容,如果未能解决你的问题,请参考以下文章
Mysql数据库安装使用教程10:列属性(列约束)---主键自增默认值注释
Ember.Select 使用 belongsTo Ember 数据模型属性的默认选择值?