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

时间:2011-07-21 17:01:03

标签: asp.net-mvc-3 entity-framework-4 data-annotations

我创建了一个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。

5 个答案:

答案 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; }
}