0

チームが任意の数の機関に所属でき、機関が任意の数のチームを保持できる、多対多の関係のフォームを構築しようとしています。

私の現在の問題は、機関をチームに割り当てることに関連しています。アイデアは、コントローラーで「addInstitution」アクションをトリガーする「この機関を追加」ボタンを備えた選択ボックスをチームフォームに配置することです。すべての機関を ViewBag SelectList オブジェクトに入れました。これは、現在割り当てられているすべての機関とともに、Team/Edit アクションに正しく表示されます。

@using (Html.BeginForm("AddInstitution", "Team", new { team = Model.ID }, FormMethod.Post))
{
    @Html.AntiForgeryToken()

    <div>
        Add to institution:
    </div>

    <div>
        @Html.DropDownList("institution", (SelectList)ViewBag.Institutions)
    </div>    

    <div>
        <ul>
            @foreach (var item in Model.Institutions)
            {
                <li>@item.InstitutionName</li>
            }
        </ul>
    </div>

    <div>
        <input type="submit" value="Add" />
    </div>

}

この情報を表示するとうまくいきます。ただし、GET または POST パラメーター (チームと機関) は受信メソッドのパラメーターにマップされるという印象を受けました。選択ボックスの値:

[HttpPost]
[ValidateAntiForgeryToken]
public string AddInstitution(Team team, Institution institution)
{
    return "team: " + team.ID + ", institution: " + institution.ID;
}

このメソッドのパラメーターは両方とも null です。メソッド署名に正しくマップされていない理由を知っている人はいますか?

おまけの質問: これは多対多の関係のフォームを構築するためのあなたの好みの戦略ですか、それとももっと良い方法はありますか?

4

2 に答える 2

0

アクションの Team および Institution パラメーターはクラスです。クラス/パラメーター名自体ではなく、そのクラスの少なくとも 1 つのプロパティに入力フィールドを提供する必要があります。

たとえば、 team パラメーターの Id プロパティにバインドするには、次の名前の非表示フィールドを使用できますteam.Id

@using (Html.BeginForm("AddInstitution", "Team", FormMethod.Post))
{
    @Html.Hidden("team.Id", Model.ID)
}

機関パラメーターについても、同じルールが適用されます。フィールドを呼び出す必要がありますinstitution.Id

@Html.DropDownList("institution.Id", (SelectList)ViewBag.Institutions)

そうすれば、モデルバインダーはクラスのインスタンスを作成し、フォームの値を Id プロパティに割り当てます。

于 2013-05-10T19:35:02.063 に答える
0

わかりましたので、私はすべてについて完全に明確ではありません。ページのモデルがどのように定義されているかを知りたいです。

FormCollectionを使用して、フォームにあるすべてのものを取得できます。

public string AddInstitution(Team team, FormCollection frm)
{
 //you should just get frm["institution"] but I'm not super sure, 
 //put a breakpoint and use the immediate window and inspect frm.
}

これを行う正しい方法は、ビューが ViewModel 内に持っているすべてのものを表すことです。ページごとに 1 つの ViewModel のみを使用する必要があります。

于 2013-05-10T17:11:18.857 に答える