2

好的,我希望有人可以帮助我解决这个问题(提前致谢!)。我正在使用 MVC4。

我的 ContractsModel 包含(除其他外)一个 ContractModel 列表。在我的部分观点中,我循环遍历列表,为每个列表创建一个表单。到现在为止还挺好。问题在于回发。第一种形式总是很好地回帖。但其他人(2、3、4 等)总是返回 null。

我已经使用调试工具进行了检查,并确认呈现的控件已正确命名。

<select name="Contracts[0].OrganizationId" id="Contracts_0__OrganizationId">
<select name="Contracts[1].OrganizationId" id="Contracts_1__OrganizationId">
<select name="Contracts[2].OrganizationId" id="Contracts_2__OrganizationId">

我还确认客户端确实将数据返回到服务器,但由于某种原因,它似乎没有重新附加到我的 ActionResult 所期望的模型中。有任何想法吗?

为了简洁起见,我已经最小化了我的代码。

这是我的模型:

public class ContractsModel
{
    public ContractsModel()  
    {
        this.Contracts = new List<ContractModel>();

        this.OrganizationList = new List<SelectListItem>();
        this.ContractNumList = new List<SelectListItem>();
    }

    public string ParentProjectId { get; set; }
    // etc, etc .....

    public List<ContractModel> Contracts { get; set; }

    public List<SelectListItem> OrganizationList { get; set; }
    public List<SelectListItem> ContractNumList { get; set; }
}


public class ContractModel
{
    public string OrganizationId { get; set; }
    public string Organization { get; set; }
    public string ContractNumId { get; set; }
    public string ContractNum { get; set; }
}

这是我的控制器动作

[HttpPost]
public ActionResult _ContractsEdit(ContractsModel model)
{

    if (ModelState.IsValid) {
        //blah, blah, blah....
    }

    return PartialView("Index", ProjectModel);
}

这是我的部分视图

@model Manager.Models.ContractsModel

@for (int i = 0; i < Model.Contracts.Count(); i++)  
{
    var divId = "divContractsModelItem_" + (i + 1);
    var saveButtonId = "btnContractsEditSave_" + (i + 1);


    <div id = "@divId">  

        @using (Html.BeginForm("_ContractsEdit", "Projects", FormMethod.Post))
        {      
            <fieldset>
                <legend>General:</legend>

                <div>
                    <label>Contracting Organization:</label>
                    @Html.DropDownListFor(model => model.Contracts[i].OrganizationId, new SelectList(Model.OrganizationList, "value", "text", Model.Contracts[i].OrganizationId))
                </div>

                <div>
                    <label>Contract Number:</label>
                    @Html.DropDownListFor(model => model.Contracts[i].ContractNumId, new SelectList(Model.ContractNumList, "value", "text", Model.Contracts[i].ContractNumId))
                </div>

                <div>
                   <button id="@saveButtonId" type="submit">Save</button>
                </div>

            </fieldset>
        }
    </div> 

} 
4

2 回答 2

1

由于我的评论对您有所帮助,因此我想我会将它们充实为完整的答案。

模型绑定的问题是它不允许您跳过数组索引 - 一旦跳过一个,它就会停止绑定。您的页面有多个表格,每个合同一个。所以第二个和后续的表单不是从索引 0 开始——它们从索引 1 开始,然后是索引 2,依此类推。因此,模型绑定立即失败,并且您将一个空对象传递给您的控制器。

简单的解决方案是移动到单个表单,以便模型绑定可以访问 Contract 对象的所有索引,然后在控制器中使用额外的代码来确定按下了哪个提交按钮。

不过,我不确定这是最好的解决方案,因为从 HTTP 的角度来看,拥有多个表单和提交按钮会更好,因为它减少了发布到服务器的不必要数据的数量。然而,最好是善的敌人,如果单一形式有效......

于 2013-05-17T17:15:14.277 回答
0

乍一看,每个表单所代表的内容与后控制器方法所期望的内容之间似乎存在脱节。看起来每个表单实例都代表一个合同,而您的控制器 post 方法需要一个完整的合同模型。也许尝试改变你的控制器方法只接受一个合同。

于 2013-05-17T16:18:51.493 回答