ホームページ > バックエンド開発 > C++ > MVC フォームがオブジェクトのリストをポストできず、コントローラーに null リストが表示されるのはなぜですか?

MVC フォームがオブジェクトのリストをポストできず、コントローラーに null リストが表示されるのはなぜですか?

Barbara Streisand
リリース: 2025-01-21 14:36:10
オリジナル
500 人が閲覧しました

Why is my MVC form failing to post a list of objects, resulting in a null list in the controller?

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート