2011-07-21 117 views
23

我创建了一个EF4.1代码优先的模型(可能重要也可能不重要),并且试图为我的Create脚手架模板获取默认值。我的模型看起来像:使用默认值在模型上注释属性

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。

回答

31

我不知道这是否会满足您的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值创建,并且只有一个地方将指定该默认值。

+0

我要补充一点,我已经尝试在构造函数,它似乎没有任何工作设置年龄属性。该视图强烈键入Person。但是,我错过的是将一个新的人物传递到视图中。这做了我想要的,并且你的解决方案已经足够干了:)(我完全省略了DefaultValue,只是使用了构造函数) –

+0

你如何访问DefaultValue属性?我找不到它。 – Johannes

+0

@Johannes也许你错过了'使用System.ComponentModel' - http://msdn.microsoft.com/en-us/library/system.componentmodel.defaultvalueattribute.aspx –

7
class Person { 
    public Person() { 
     Age = 18;  
    } 
    public int Age { get; set; } 
} 

在这种情况下,你每次做一个新时代的人的时间将与18年龄被初始化,即使是通过模型绑定创建新的对象。

1

型号

class Person { 
    public Person() { 
     Age = 18;  
    } 
    public int Age { get; set; } 
} 

控制器

public ActionResult Create() { 
    return View(new Person()); 
} 

它工作正常。

1

假设你的观点有一个定义,如: -

@model Person 

和你的控制器HTML GET返回一个空查看

return View(); 

然后只需添加可渲染的类,它包含默认值

return View(new Person{ Age = 18 }); 

另一种选择是将单例静态助手添加到您的Person c姑娘返回默认值,填充类

static public Person GetDefaultNew() 
     { 
      return new Person{ Age = 18 }; 
     } 

然后,你需要

return View(new Person.GetDefaultNew()); 
+0

您不需要从GetDefaultNew()返回新的回报,但我知道您要去哪里。在原来的问题中,我只是忘记了将模型的任何实例都传递给它。 –

+0

为了扩展我的答案,我会说,值得创建自己的“ViewModel”类,它具有视图所需的所有实例数据。这可以使控制器瘦,使用注释的模型以及使用业务规则和其他选项的视图模型类(例如设置默认业务值 - 其中一些参数不会在没有引用其他列表查看模型)。它也使得您的视图模型具有高度可测性并且视图尽可能简单 – pixelda

0

设置JSON。净的DefaultValueHandling参数,使默认值工作:

class Person { 
    [JsonProperty("Age", DefaultValueHandling = DefaultValueHandling.IgnoreAndPopulate)] 
    [DefaultValue(18)] 
    public int Age { get; set; } 
}