5

部分ビューを作成しました (エディター テンプレートであっても)。ビューにサブモデルを渡しますが、[送信] をクリックすると、部分ビューから常に「null」が返されます。サブモデル以外のメインモデルのプロパティ値を取得できます。

主なモデル

public class PetModel
{
  public string name {get; set;}
  public long SpeciesID {get; set;}
  public long BreedID {get; set;}
  public Calendar DOB {get; set;} 
} 

サブモデル

public class Calendar
{
    public string Year{get; set;}
    public string Month{get; set;}
    public string Day{get; set;}
}

メインビュー

    @model Application.Models.PetModel
    @using (Html.BeginForm("CatchPetContent", "Quote",Model))
   {
     @Html.TextBoxFor(x => x.Name)
     @Html.DropDownListFor(x=>x.SpeciesID,new List<SelectListItem>(),"select")
     @Html.DropDownListFor(x=>x.BreedID,new List<SelectListItem>(),"select")
     @Html.EditorFor(Model => x.DOB)
     <input type="submit" value="submit" />
   }

エディタ テンプレート

@model Application.Models.Calendar
@Html.DropDownListFor(Model => Model.Day, new List<SelectListItem>())
@Html.DropDownListFor(Model => Model.Month,new List<SelectListItem>())
@Html.DropDownListFor(Model => Model.Year, new List<SelectListItem>())

「CatchPetContent」アクション

[HttpPost]
public ActionResult CatchPetContent(PetModel Model)
{


        PetModel pet = new PetModel();
        pet.Name = Model.Name;
        pet.SpeciesID = Model.SpeciesID;
        pet.BreedID = Model.BreedID;
        pet.DOB = Model.DOB;// always null

        RouteValueDictionary redirectTargetDictionary = new RouteValueDictionary();
        redirectTargetDictionary.Add("Controller", "Home");
        redirectTargetDictionary.Add("Action", "Index");

        return new RedirectToRouteResult(new  RouteValueDictionary(redirectTargetDictionary));

}

デバッグすると、「Model.DOB」は常にnullです

4

4 に答える 4

0

デフォルトのモデル バインダーは、ネストされたオブジェクトをバインドします。このシナリオでは、独自のモデル バインダーを作成する必要はありません。

参照: http://lostechies.com/jimmybogard/2011/09/07/building-forms-for-deep-view-model-graphs-in-asp-net-mvc/ および SO DefaultModelBinder がネストされたモデルをバインドしていない

あなたの問題は、エディター テンプレートがポスト バックを介して何も返さないため、ネストされたオブジェクトが null であることだと思います。エディター テンプレートの行:

@Html.DropDownListFor(Model => Model.Day, new List<SelectListItem>())
@Html.DropDownListFor(Model => Model.Month,new List<SelectListItem>())
@Html.DropDownListFor(Model => Model.Year, new List<SelectListItem>())

空のドロップダウンを持つ 3 つのコントロールが表示されます。値を指定していないため、これらのドロップダウンから何も選択できません。値がない場合、ネットワーク経由で送信されず、モデルにバインドできません。まず、エディター テンプレートを次のように変更します。

@Html.TextBoxFor(Model => Model.Day)
@Html.TextBoxFor(Model => Model.Month)
@Html.TextBoxFor(Model => Model.Year)

これにより、実際にフォームにデータを入力できるようになります。これが機能したら、テキスト ボックスをドロップダウンに戻すことができますが、選択リストの値を指定する必要があります。新しい空のリストを作成するだけでは、値を選択できません。

于 2013-05-16T21:34:38.943 に答える