GET和POST值未正确映射到方法签名

时间:2013-05-10 16:39:05

标签: asp.net asp.net-mvc razor

我正在尝试建立一个多对多关系的表格,其中团队可以属于任意数量的机构,而且机构可以容纳任意数量的团队。

我目前的问题与将机构分配给团队有关。我们的想法是在团队表单上有一个“添加此机构”按钮的选择框,它会在控制器中触发“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。任何人都知道为什么他们没有正确映射到方法签名?

奖金问题:这是建立多对多关系表单的首选策略,还是有更好的方法?

2 个答案:

答案 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属性。