0

私はネット全体を調査しましたが、ここで誰かが私を助けてくれることを願っています。

次の ViewModel クラスがあります。

public class PersonEditViewModel
{
    public Person Person { get; set; }
    public List<DictionaryRootViewModel> Interests { get; set; }
}

public class DictionaryRootViewModel
{
    public long Id { get; set; }
    public string Name { get; set; }
    public ICollection<DictionaryItemViewModel> Items;

    public DictionaryRootViewModel()
    {
        Items = new List<DictionaryItemViewModel>();
    }
}

public class DictionaryItemViewModel
{
    public long Id { get; set; }
    public string Name { get; set; }
    public bool Selected { get; set; }
}

編集ビューでは、カスタム EditorTemplate を使用して、興味のコレクションをレイアウトします@Html.EditorFor(m => m.Interests)。レンダリングを行う 2 つの EditorTemplates があります。

  1. DictionaryRootViewModel.cshtml:

    @model Platforma.Models.DictionaryRootViewModel
    @Html.HiddenFor(model => model.Id)
    @Html.HiddenFor(model => model.Name)
    @Html.EditorFor(model => model.Items)
    
  2. DictionaryItemViewModel.cshtml:

    @model Platforma.Models.DictionaryItemViewModel
    @Html.HiddenFor(model => model.Id)
    @Html.CheckBoxFor(model => model.Selected)
    @Html.EditorFor(model => model.Name)
    

問題:

POST を使用してフォームを送信するInterestsと、コレクションのみが入力され、Interest.Itemsコレクションは常に空になります。リクエストには (特に) 次のフィールド名が含まれています。これらは、コントローラー アクション メソッドで Request.Forms データを検査するときにも存在します。

  • 興味[0].ID
  • 興味[0].名前
  • Interests[0].Items[0].Id
  • Interests[0].Items[0].Selected

すべてに適切な値が含まれていますが、コントローラー側では、オブジェクト pvm in メソッド:

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit(PersonEditViewModel pvm)
{
}

Interests コレクション (正しい ID と名前を持つ項目) にデータが含まれていますが、コレクションの各要素について、項目のサブコレクションは空です。

モデルを正しく選択するにはどうすればよいですか?

4

2 に答える 2

2

いつものように、答えはずっと目の前にありました。DefaultModelBinder は、リクエストで渡されたアイテムの値を取得しませんでした。これは、Items コレクションをプロパティとしてマークするのを「忘れていた」ためです。これはフィールドでした。@pjobs による有益な発言を考慮した正しい形式:

public List<DictionaryItemViewModel> Items{取得;設定;}

于 2015-04-22T15:26:19.060 に答える