ASP MVC3 - 编辑模板在回发时将空值返回给控制器

时间:2013-04-04 19:13:40

标签: asp.net-mvc asp.net-mvc-3 asp.net-mvc-2 mvc-editor-templates icollection

我已经在一个项目上苦苦挣扎了几天,在我目前的迭代中,我决定使用编辑模板。

原始问题源自通过SQL中的外键链接到辅助表的主表。在ASP MVC中,辅助表用以下字段表示:

    [UIHint("BankListAgentId")]
    public virtual ICollection<BankListAgentId> BankListAgentId { get; set; }

因为这是一个集合对象,所以“编辑”页面上的GET适用于每个特定项目,但是在POSTBACK上,所有集合项目都突然为空。但是,所有其他字段都带有适当的数据。我正在尝试使用和编辑模板,但是仍然会返回集合项null

以下是我在视图中使用的代码

@model Monet.Models.BankListMaster
@using (Html.BeginForm())
{
    <fieldset>
        <legend>Stat(s) Fixed</legend>
        <table id="fixedRows">
            <tr>
                <th>State Code</th>
                <th>Agent ID</th>
                <th></th>
            </tr>

            @foreach (var item in Model.BankListAgentId)
            {                    

                if (!String.IsNullOrWhiteSpace(item.AgentId) && item.FixedOrVariable.Equals("Fixed"))
                {
                    @Html.EditorFor(model => item)                     

                }
            }
        </table>
        <br />
        @Html.ActionLink("Add another", "BlankFixedRow", null, null, new { id = "addFixed" })
    </fieldset>
}

这是编辑器模板。它的名称是BankListAgentId,位于Views文件夹中名为EditorTemplates的文件夹中 enter image description here

@model Monet.Models.BankListAgentId

    <tr id="item-@Model.AgentId">
        <td>
            @Html.DropDownListFor(model => model.StateCode,
                (SelectList)ViewBag.StateCodeList, Model.StateCode)
        </td>
        <td>
            @Html.EditorFor(model => model.AgentId)
            @Html.ValidationMessageFor(model => model.AgentId)
        </td>
        <td>
            <a href="#" class="deleteRow">delete</a>
        </td>
        @*<td><a href="#" onclick="$('#item-@Model.AgentId').parent().remove();" style="float:right;">Delete</a></td>*@
    </tr>

以下是BankListMaster型号

的代码
public partial class BankListMaster
{
    public BankListMaster()
    {
        this.BankListStateCode = new HashSet<BankListStateCode>();
        this.BankListAgentId = new HashSet<BankListAgentId>();
        this.BankListAttachments = new HashSet<BankListAttachments>();
    }

    public int ID { get; set; }
    public string BankName { get; set; }

    public virtual ICollection<BankListStateCode> BankListStateCode { get; set; }
    public virtual ICollection<BankListAttachments> BankListAttachments { get; set; }

    [UIHint("BankListAgentId")]
    public virtual ICollection<BankListAgentId> BankListAgentId { get; set; }
}

最后这里是BankListAgentId模型

public partial class BankListAgentId
{
    public string AgentId { get; set; }
    public int ID { get; set; }
    public string FixedOrVariable { get; set; }
    public string StateCode { get; set; }

    public virtual BankListMaster BankListMaster { get; set; }
}

修改

用户需要能够动态更改列表。

1 个答案:

答案 0 :(得分:0)

我认为您需要将此作为对集合的迭代,而不是foreach,以便正确绑定字段名称。

@for (int i = 0; i < Model.BankListAgentId.Count; i++)
            {                    
                if (!String.IsNullOrWhiteSpace(Model.BankListAgentId[i].AgentId) && Model.BankListAgentId[i].FixedOrVariable.Equals("Fixed"))
                {
                    @Html.EditorFor(model => Model.BankListAgentId[i])
                }
            }

您也应该发布接收的ActionResult。

P.S。但正如DaveA正确地指出模型是ICollection,这将导致问题。它不是IEnumerable吗?