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が壊れているようです。
これがあなたの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つだけになります。
class Person {
public Person() {
Age = 18;
}
public int Age { get; set; }
}
このシナリオでは、新しいオブジェクトがモデルバインダーによって作成された場合でも、新しいPerson年齢を行うたびに年齢として18で初期化されます。
モデル
class Person {
public Person() {
Age = 18;
}
public int Age { get; set; }
}
コントローラ
public ActionResult Create() {
return View(new Person());
}
正常に動作します。
ビューに次のような定義があると仮定します-
@model Person
コントローラーのHTML GETは空のビューを返します
return View();
次に、デフォルト値を含むレンダリング可能なクラスを追加するだけです
return View(new Person{ Age = 18 });
もう1つのオプションは、デフォルトの設定済みクラスを返すシングルトン静的ヘルパーをPersonクラスに追加することです
static public Person GetDefaultNew()
{
return new Person{ Age = 18 };
}
それからあなたが必要
return View(new Person.GetDefaultNew());
JSON.netの DefaultValueHandling パラメーターを設定すると、DefaultValueが機能します。
class Person {
[JsonProperty("Age", DefaultValueHandling = DefaultValueHandling.IgnoreAndPopulate)]
[DefaultValue(18)]
public int Age { get; set; }
}