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