複雑なモデルと部分的なビュー - ASP.NET MVC 3 のモデル バインディングの問題 質問する

複雑なモデルと部分的なビュー - ASP.NET MVC 3 のモデル バインディングの問題 質問する

サンプル 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.cshtmlHome

@model SimpleModel
@Html.LabelFor(model => model.Status)
@Html.EditorFor(model => model.Status)

もちろん、規則に従わずに特別な場所に部分的な配置を希望する場合は (なぜそうするのでしょうか?)、場所を指定できます。

@Html.EditorFor(x => x.Simple, "~/Views/SomeUnexpectedLocation/_SimplePartial.cshtml")

そうすれば、すべてが期待どおりに整うでしょう。

おすすめ記事