サンプル MVC 3 アプリケーションには、次に示すように 2 つのモデルがありSimpleModel
ますComplexModel
。
public class SimpleModel
{
public string Status { get; set; }
}
public class ComplexModel
{
public ComplexModel()
{
Simple = new SimpleModel();
}
public SimpleModel Simple{ get; set; }
}
このモデルのビューを定義しました:
_SimplePartial.cshtml
:
@model SimpleModel
@Html.LabelFor(model => model.Status)
@Html.EditorFor(model => model.Status)
そしてComplex.cshtml
:
@model ComplexModel
@using (Html.BeginForm()) {
@Html.Partial("_SimplePartial", Model.Simple)
<input type="submit" value="Save" />
}
フォームを送信した後、Status
フィールドにランダムな値が入力されても、その値はモデルにバインドされません。フィールドは、コントローラー アクションでモデルをチェックしているときStatus
です。NULL
[HttpPost]
public ActionResult Complex(ComplexModel model)
{
// model.Simple.Status is NULL, why ?
}
なぜバインドされないのですか? モデルを継承したくありません。このような単純なケースでは、カスタム モデル バインダーを作成する必要がありますか?
よろしくお願いいたします。
ベストアンサー1
の代わりに:
@Html.Partial("_SimplePartial", Model.Simple)
エディター テンプレートの使用をお勧めします:
@model ComplexModel
@using (Html.BeginForm())
{
@Html.EditorFor(x => x.Simple)
<input type="submit" value="Save" />
}
次に、コントローラの名前の内側~/Views/Shared/EditorTemplates/SimpleModel.cshtml
または内側に単純な部分を配置します。~/Views/Home/EditorTemplates/SimpleModel.cshtml
Home
@model SimpleModel
@Html.LabelFor(model => model.Status)
@Html.EditorFor(model => model.Status)
もちろん、規則に従わずに特別な場所に部分的な配置を希望する場合は (なぜそうするのでしょうか?)、場所を指定できます。
@Html.EditorFor(x => x.Simple, "~/Views/SomeUnexpectedLocation/_SimplePartial.cshtml")
そうすれば、すべてが期待どおりに整うでしょう。