MVC フォームはオブジェクト リストを送信できません
MVC アプリケーションで、ユーザーは問題に遭遇しました。オブジェクトのリストを含むフォームがコントローラーにデータを送信できず、空のリストが渡されてしまいました。フォームはループと部分ビューを使用して項目をレンダリングしますが、送信時にコントローラーは空の列挙型を受け取ります。
問題分析
データが正しく送信されない理由を理解するために、提供されたコードを調べてみましょう:
親ビュー:
<code class="language-csharp">@foreach (var planVM in Model) { @Html.Partial("_partialView", planVM) }</code>
部分ビュー (_partialView):
<code class="language-csharp">@Html.HiddenFor(p => p.PlanID) @Html.HiddenFor(p => p.CurrentPlan) @Html.CheckBoxFor(p => p.ShouldCompare)</code>
PlanCompareViewModel クラス:
<code class="language-csharp">public class PlansCompareViewModel { public int PlanID { get; set; } public Plan CurrentPlan { get; set; } public bool ShouldCompare { get; set; } }</code>
解決策
問題の根本原因は、フォーム要素の名前の付け方にあります。インデックスがないと、モデル バインダーはリストの要素を区別できません。これを修正するには、フォーム要素の名前に正しいインデックスを割り当てる必要があります:
改善された部分ビュー (_partialView):
<code class="language-csharp">@for (int i = 0; i < Model.Count(); i++) { @Html.HiddenFor(p => p[i].PlanID) @Html.HiddenFor(p => p[i].CurrentPlan) @Html.CheckBoxFor(p => p[i].ShouldCompare) }</code>
この変更により、モデル バインダーが個々のデータ要素を正しいリスト項目に関連付けることができます。
エディター テンプレートを使用してフォーム生成を改善します
より簡潔かつ効率的に行うために、エディター テンプレートを使用することをお勧めします。 EditorTemplates フォルダーに PlanCompareViewModel.cshtml を作成することで、ビューの一部を次のコンテンツに置き換えることができます:
<code class="language-csharp"><div> @Html.HiddenFor(p => p.PlanID) @Html.HiddenFor(p => p.CurrentPlan) @Html.CheckBoxFor(p => p.ShouldCompare) </div></code>
最後に、親ビューは次のように簡略化できます:
<code class="language-csharp">@Html.EditorForModel()</code>
エディター テンプレートはインデックス付けを自動的に処理し、モデル バインディングに対してフォーム要素に正しい名前が付けられるようにします。
以上がMVC フォームがオブジェクトのリストをポストできず、コントローラーに null リストが表示されるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。