使用默认值注释模型上的属性

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; 

【讨论】:

以上是关于使用默认值注释模型上的属性的主要内容,如果未能解决你的问题,请参考以下文章

如何使用java注释设置类属性的默认值[重复]

Mysql数据库安装使用教程10:列属性(列约束)---主键自增默认值注释

Ember.Select 使用 belongsTo Ember 数据模型属性的默认选择值?

如何在 Laravel 模型上设置属性的默认值 [重复]

Magento - 如何以编程方式取消选中超级产品属性上的“使用默认值”?

更新CoreData模型版本时如何为实体的新属性设置默认值