0

我正在尝试为多对多关系构建一个表单,其中团队可以属于任意数量的机构,机构可以拥有任意数量的团队。

我目前的问题与将机构分配给团队有关。这个想法是在团队表单上有一个带有“添加此机构”按钮的选择框,该按钮会触发控制器中的“添加机构”操作。我已将所有机构放入 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 参数(团队和机构)都会映射到接收方法的参数,这就是为什么我将团队放在 objectRouteValues 的形式中,而我希望机构由选择框值:

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

此方法中的两个参数均为空。任何人都知道为什么它们没有正确映射到方法签名?

额外的问题:这是您为多对多关系构建表单的首选策略,还是有更好的方法?

4

2 回答 2

0

您操作的团队和机构参数是类。您必须为该类的至少一个属性提供输入字段,而不是为类/参数名称本身提供输入字段。

例如,要绑定到 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)

这样,modelbinder 将创建您的类的实例并将表单值分配给 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 中的所有内容。您应该每页只有一个 ViewModel。

于 2013-05-10T17:11:18.857 回答