我正在尝试使用Steve Sanderson 的关于将集合项绑定到模型的博客文章。但是,我看到一些奇怪的行为,我在帖子或其他讨论中找不到答案。
在我的模型BankListMaster
中,我有ICollection
一个单独的模型对象BankAgentId
。BankListMaster
并且BankListAgentId
在我们的 SQL 数据库中有一对多的关系。
我在Edit
页面上遇到了问题。当页面加载时,我们当前与BankListMaster
我正在使用的项目关联的三个代理 ID 会正确加载。但是,如果我点击“保存”,我会看到ICollection
对象 ( bankListAgentId
) 包含三个项目,但每个字段都包含一个null
值。
如果我选择Add another
,则按照博客文章中的说明,Ajax 会调用部分视图,该视图会正确附加到表中。
现在,如果我点击“保存”,我会看到ICollection
对象计数增加了一个项目,计数为 4。最初加载的所有项目都GET
包含null
字段值,但新附加项目的AgentId
和StateCode
字段包含正确的信息(但是,新项目的所有其他字段都是null
)。
对 ASP MVC 来说还是比较新的,所以我不确定发生了什么或看什么方向。
这是主视图中的表格。我已经在有和没有这些@Html.Hidden
物品的情况下尝试过这个,并收到了相同的结果。
@model Monet.Models.BankListMaster
@{
ViewBag.Title = "Edit";
}
<fieldset>
<legend>Stat(s) Fixed</legend>
<table id="fixedRows">
<thead>
<tr>
<th>State Code</th>
<th>Agent ID</th>
<th></th>
<th></th>
</tr>
</thead>
<tbody>
@for (int i = 0; i < Model.Fixed.Count; i++)
{
using (Html.BeginCollectionItem("BankListAgentId"))
{
@Html.HiddenFor(m => Model.Fixed[i].BankID)
@Html.HiddenFor(m => Model.Fixed[i].TableId)
@Html.HiddenFor(m => Model.Fixed[i].FixedOrVariable)
<tr>
<td>
@Html.DropDownListFor(m => Model.Fixed[i].StateCode,
(SelectList)ViewBag.StateCodeList, Model.Fixed[i].StateCode)
</td>
<td>
@Html.TextBoxFor(m => Model.Fixed[i].AgentId)
@Html.ValidationMessageFor(m => Model.Fixed[i].AgentId)
</td>
<td>
<a href="javascript:void(0)" class="deleteRow">delete</a>
</td>
@*<td><a href="#" onclick="$('#item-@Model.AgentId').parent().remove();" style="float:right;">Delete</a></td>*@
</tr>
}
}
</tbody>
</table>
<br />
<a href="javascript:void(0)" class="addFixed">Add Another</a>
</fieldset>
这是部分视图。同样,我尝试了使用和不使用这些@Html.Hidden
项目并收到相同的结果。
@model Monet.Models.BankListAgentId
@{
Layout = null;
}
@using (Html.BeginCollectionItem("BankListAgentId"))
{
@Html.HiddenFor(model => model.TableId)
@Html.HiddenFor(model => model.BankID)
@Html.HiddenFor(model => model.FixedOrVariable)
<tr>
<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="javascript:void(0)" class="deleteRow">delete</a>
</td>
@*<td><a href="#" onclick="$('#item-@Model.AgentId').parent().remove();" style="float:right;">Delete</a></td>*@
</tr>
}
这是 Ajax 调用
$(document).ready(function () {
$(".addFixed").click(function () {
$.ajax({
url: '@Url.Action("BlankFixedRow", "BankListMaster")',
dataType: 'html',
cache: false,
success: function (html) {
$("#fixedRows > tbody").append('<tr>' + html + '</tr>');
}
});
});
});
这是调用局部视图的控制器方法
public ViewResult BlankFixedRow()
{
SelectList tmpList = new SelectList(new[] { "AL", "AK", "AS", "AZ", "AR", "CA", "CO", "CT", "DE", "DC", "FM", "FL", "GA", "GU", "HI", "ID", "IL", "IN", "IA", "KS", "KY", "LA", "ME", "MH", "MD", "MA", "MI", "MN", "MS", "MO", "MT", "NE", "NV", "NH", "NJ", "NA", "NM", "NY", "NC", "ND", "MP", "OH", "OK", "OR", "PW", "PA", "PR", "RI", "SC", "SD", "TN", "TX", "UT", "US", "VT", "VI", "VA", "WA", "WV", "WI", "WY" });
ViewBag.StateCodeList = tmpList;
return View("FixedPartialView", new BankListAgentId());
}
这是BankListMaster
模型
public partial class BankListMaster
{
public BankListMaster()
{
this.BankListAttachments = new HashSet<BankListAttachments>();
this.BankListAgentId = new HashSet<BankListAgentId>();
}
public int ID { get; set; }
public string BankName { get; set; }
public string LastChangeOperator { get; set; }
public Nullable<System.DateTime> LastChangeDate { get; set; }
public virtual ICollection<BankListAttachments> BankListAttachments { get; set; }
public virtual ICollection<BankListAgentId> BankListAgentId { get; set; }
}
这就是BankListAgentId
模型
public partial class BankListAgentId
{
public string AgentId { get; set; }
public int BankID { get; set; }
public string FixedOrVariable { get; set; }
public string StateCode { get; set; }
public int TableId { get; set; }
public virtual BankListMaster BankListMaster { get; set; }
}
这是通过 fiddler 从帖子上的表单发送回控制器的内容。索引为1、2和3的项目是最初从数据库中提取的项目。最后一项是通过对局部视图的 jQuery/Ajax 调用添加的。