0

Ajax.BeginForm フォームを送信すると、コントローラーでモデルの null 値が取得されます。モデル内に別のモデルがある (1 対多の関係)

これが私のサンプルビューコードです(不要なものを削除しました)

 <table id="PageSortTable" class="travelads_business_rules" cellspacing="0">
<thead>
    <tr valign="bottom">
        <th>ID</th>
        <th>&nbsp;</th>
        <th>&nbsp;</th>
        <th>Rule Name</th>
        <th>Business</th>
        <th>Region</th>
        <th>Form</th>
        <th>Company</th>
        <th>Team</th>
        <th>Language</th>
        <th>Media</th>
        <th>InsertLoc</th>
        <th>Size</th>
        <th>Access</th>
    </tr>
</thead>
<tbody>
    @foreach (var item in Model)
    {
        <tr valign="top">
            <td class="col_a">
                <span>@item.id</span>
            </td>
            <td class="col_b">
                <a href="@(Url.Action("EditTravelAdsRule", new { id = item.id }))">
                    <img alt="Edit" class="tableItemImage" src="../../Content/Images/Edit-icon.PNG" title="Edit" />
                </a><a href="@(Url.Action("DeleteTravelAdsRule", new { id = item.id }))">
                    <img alt="Delete" class="tableItemImage" src="../../Content/Images/delete-icon.PNG"
                        title="Delete" />
                </a>
            </td>
            <td class="col_c">
                <div class="tableButtonCell"><a href="#" onclick='DoExpandCollapsh("trMinimised@(item.id)")'>
                        <img alt="Details" class="tableItemImage" src="../../Content/Images/expand-icon.png"
                            title="Expand" /></a></div>
            </td>
            <td class="col_d"><span>@item.ad_rule_name</span></td>
            <td class="col_f"><span>@item.business</span></td>
            <td class="col_g"><span>@item.ad_region</span></td>
            <td class="col_h"><span>@item.ad_form</span></td>
            <td class="col_i"><span>@item.ad_company</span></td>
            <td class="col_j"><span>@item.ad_team</span></td>
            <td class="col_k"><span>@item.ad_language</span></td>
            <td class="col_l"><span>@item.ad_media_id</span></td>
            <td class="col_m"><span>@item.ad_insert_loc</span></td>
            <td class="col_n"><span>&nbsp;</span></td>
            <td class="col_o"><span>@item.access</span></td>
        </tr>
        <tr class="minimised" id='trMinimised@(item.id)'>
            <td colspan="13">
                @using (Ajax.BeginForm("_SaveGroupMatchs", null, new AjaxOptions { OnSuccess = "onSuccess", UpdateTargetId = "msgResult", LoadingElementId = "msgLoading" }, new { @id = "SaveForm"}))
                {  

                <div class="detail">
                    <div class="table_header">
                        <span class="col_a">Group</span> <span class="col_b">Group Scope</span> <span class="col_c">
                            Seq</span> <span class="col_d">&nbsp;</span> <span class="col_e">ID</span> <span
                                class="col_f">Match Location</span> <span class="col_g">Target Field</span>
                        <span class="col_h">Match Type</span> <span class="col_i">Set Name</span>
                    </div>
                    <!-- Loop for matches -->
                    <!-- start GROUP -->
                    <div class="group">
                        @foreach (var item1 in item.lstMatches)
                        {
                            <div id="rule@(item.id)_divRuleGroup_@(item1.match_group_num)">
                            <header id="header_rule_Group"><span class="col_a">@(item1.match_group_num)  </span><span class="col_b">
                                            @Html.DropDownListFor(model => item1.match_group_scope, new SelectList((List<QIOnlineMVC3.Helpers.clsGroupScope>)QIOnlineMVC3.Helpers.General.GetALLGroupScope(), "GroupNum", "GroupScope", item1.match_group_num))
                                          </span></header>
                            <div class="match">
                                <span class="col_c">@(item1.match_group_seq) @Html.HiddenFor(model=>item1.match_group_seq) </span> <span class="col_d"><a href="#">
                                    <img src="../../Content/Images/delete-icon.png" width="17" height="17" border="0"
                                        title="delete" /></a> </span><span class="col_e">@(item1.match_id)
                                        </span><span class="col_f">
                                            @Html.DropDownListFor(model => item1.match_loc, new SelectList((List<QIOnlineMVC3.Helpers.clsMatchLocations>)QIOnlineMVC3.Helpers.General.GetALLMatchLocations(), "MatchLocations", "MatchLocations", item1.match_loc))
                                        </span><span class="col_g">
                                            @Html.DropDownListFor(model => item1.match_target_field, new SelectList((List<QIOnlineMVC3.Helpers.clsTargetField>)QIOnlineMVC3.Helpers.General.GetALTargetField(), "TargetField", "TargetField", item1.match_target_field))
                                        </span><span class="col_h">
                                            @Html.DropDownListFor(model => item1.match_type, new SelectList((List<QIOnlineMVC3.Helpers.clsMatchType>)QIOnlineMVC3.Helpers.General.GetALLMatchType(), "MatchTypeID", "MatchType", item1.match_type))
                                        </span><span class="col_i">
                                            @Html.TextBoxFor(model => item1.match_set_name, new { @value = item1.match_set_name, @class="clsauto" })
                                           @* <input type="text" name="sets" id="sets" class="clsauto" style="width:200px;" value='@(item1.match_set_name)'/>*@
                                            </span>
                            </div>
                            </div>
                        }
                        <!-- end MATCH -->
                        <div class="new">
                            <a href="#">
                                <img src="../../Content/Images/new-icon.png" width="17" height="17" border="0" alt="New Match" />New
                                Match</a></div>
                    </div>
                    <!-- end MATCH GROUP -->
                    <!-- END Loop of Matches -->
                    <div class="new new_group">
                        <img alt="" src="../../Content/Images/new-icon.png" width="17" height="17" border="0" />@Ajax.ActionLink("New Group", "GetGroupMatch", new AjaxOptions{ UpdateTargetId = "divNewGroup", HttpMethod = "Get", InsertionMode = InsertionMode.InsertAfter})
                        <div class="delete_group">
                            Delete Group ID:
                            <input type="text" id='txtdeleteGroupNo_@(item.id)' />
                            <input type="submit" id='btnDeleteGroup_@(item.id)' value="Delete Group" class="btn btn_delete" style="float: none;" onclick="return DeleteGroup(this);" />
                        </div>
                    </div>
                    <div id="divNewGroup">
                    </div>
                    <div class="btn_row">
                        <input type="reset" name="reset" class="btn" value="Cancel" onclick='DoExpandCollapsh("trMinimised@(item.id)","main_collapsed@(item.id)","main_expanded@(item.id)")'/>
                        <input type="submit" name="btnSave" class="btn" value="Save" />
                        <a href="@(Url.Action("DeleteTravelAdsRule", new { id = item.id }))" class="btn btn_delete">
                            Delete Rule</a>
                    </div>
                </div>
                }

            </td>
        </tr>

    }
</tbody>

これが私のコントローラーアクションです

  [Authorize]
    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult _SaveGroupMatchs(FormCollection fc, TravelAdsRulesMatchsGroups trmg)
    { 
   // trmg is null here... I  am getting form collection but its comma separated, very annoying to deal with that.
   }

モデル値を取得するにはどうすればよいですか。

私のクラス情報はこちら

メイン クラス TravelAds - メール レコードを表示するために必要 (グリッド)

TravelAdsRulesMatchsGroups - テーブル内の最初の foreach ループ クラス

MatchCollection - TravelAdsRulesMatchsGroups 内の 2 番目の foreach ループ クラス

私は TravelAdsRulesMatchsGroups オブジェクトを値とコントローラーのサブクラス (Match Collection) で取得しようとしていますが、とにかく存在するはずです。

前もって感謝します - アミット・プラジャパティ

4

1 に答える 1

0

あなたforeachが書いたループはすべてを殺しています。デフォルトのモデル バインダーが期待する入力要素の命名に使用する必要がある標準的な規則についてお読みください: http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx

次に、ページの生成された HTML ソース コード、より具体的には入力フィールドの名前を見てください。めちゃくちゃですね。デフォルトのモデル バインダーが期待するものと一致するものはありません。生成された入力フィールドの名前などの式を使用するmodel => item1.match_typeと、複合プロパティの現在のナビゲーション コンテキストが考慮されません。

1 つの可能性は、これらの foreach ループの代わりにエディター テンプレートを使用することです。それは私が推奨する解決策です。私はそれらについて膨大な数の投稿を書いてきましたが、Googleだけです。

もう 1 つの可能性は、インデックス付きコレクションを使用するようにモデルを変更し、for代わりにループを使用することforeachです。

@for (var i = 0; i < Model.Count; i++)
{
    ... some stuff ....

    @Html.TextBoxFor(x => x[i].SomeProperty)

    @for (var j = 0; j < Model[i].SomeCollectionProperty.Count; j++)
    {
        ... some stuff, ajax forms etc ....
        @Html.TextBoxFor(x => x[i].SomeCollectionProperty[j].SomeOtherProperty)
    }
}

使用されているラムダ式に、ナビゲーション プロパティ名だけでなくインデックスも含まれていることに注目してください。これにより、ヘルパーは入力フィールドに適切な名前を生成できます。

于 2012-07-27T08:08:58.623 に答える