我正在尝试建立一个多对多关系的表格,其中团队可以属于任意数量的机构,而且机构可以容纳任意数量的团队。
我目前的问题与将机构分配给团队有关。我们的想法是在团队表单上有一个“添加此机构”按钮的选择框,它会在控制器中触发“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参数(团队和机构)都会映射到接收方法的参数,这就是我将团队放在objectRouteValues形式的原因,而我期望该机构由选择框值:
[HttpPost]
[ValidateAntiForgeryToken]
public string AddInstitution(Team team, Institution institution)
{
return "team: " + team.ID + ", institution: " + institution.ID;
}
此方法中的两个参数均为null。任何人都知道为什么他们没有正确映射到方法签名?
奖金问题:这是建立多对多关系表单的首选策略,还是有更好的方法?
答案 0 :(得分: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。
答案 1 :(得分: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属性。