2011-07-21 5 views
23

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を中断すると思われます。

答えて

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

ビューを保つが、これ行うcreateアクションで:

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

そのように、入力されたテキストボックスは次のようになりますデフォルトのAge値で作成され、そのデフォルトが指定される場所は1つだけです。このシナリオでは

+0

私はすでにどちらか動作していないようでしたコンストラクタに年齢プロパティを設定してみてくださいなかったことを追加する必要があります。ビューはPersonに強く型付けされています。しかし、私が見逃していたのは、新しいPersonをビューに渡すことでした。それは私が望んだことでした、あなたのソリューションは十分乾燥しています:)(私はDefaultValueを完全に省略し、コンストラクタを使用しています) –

+0

DefaultValue属性にはどのようにアクセスしますか?私はそれを見つけることができません。 – Johannes

+0

@Johannesおそらくあなたは 'using 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

ビューのような定義を持っていると仮定すると: - GETは空のビュー

return View(); 

を返すHTML

@model Person 

とあなたのコントローラは、単にデフォルトが含まれて描画することができるクラスを追加値

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

別のオプションとして、Personton cのスタティックヘルパーを追加することもできますデフォルトを返し少女、人口の多いクラス

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

は、その後、あなたはJSONを設定

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

を参照してください。GetDefaultNew()からのリターンを新しくする必要はありませんが、どこに行くのか分かります。元の質問では、モデルのインスタンスを一緒に渡すことを忘れてしまっただけです。 –

+0

私の答えを拡張するには、ビューに必要なすべてのインスタンスデータを持つ独自の "ViewModel"クラスを作成する価値があると思います。これにより、ビジネスルールやその他のオプション(デフォルトのビジネス値の設定など)を持つコントローラースキン、アノテーション付きモデル、およびビューモデルクラスが保持されます。その中には、他のリストも参照することなく知ることができないものがありますビューモデル)を表示します。また、ビューモデルのテスト可能性を高め、ビューをできるだけシンプルにします – pixelda

0

を必要としています。ネットのDefaultValueHandlingパラメータはのDefaultValue作業を行います

class Person { 
    [JsonProperty("Age", DefaultValueHandling = DefaultValueHandling.IgnoreAndPopulate)] 
    [DefaultValue(18)] 
    public int Age { get; set; } 
} 
関連する問題