Nea*_*alR 5 jquery icollection asp.net-mvc-3 asp.net-mvc-2
我正在尝试使用 史蒂夫·桑德森(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>
Run Code Online (Sandbox Code Playgroud)
这是局部视图。同样,我尝试了有无@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>
}
Run Code Online (Sandbox Code Playgroud)
这是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>');
}
});
});
});
Run Code Online (Sandbox Code Playgroud)
这是调用局部视图的控制器方法
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());
}
Run Code Online (Sandbox Code Playgroud)
这是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; }
}
Run Code Online (Sandbox Code Playgroud)
这是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; }
}
Run Code Online (Sandbox Code Playgroud)
这是帖子上的表单通过提琴手发送回控制器的内容。被索引的项目1,2和3是最初从数据库中抽取的项目。最后一项是通过jQuery / Ajax调用添加到局部视图的。

我的解决方案是: html.beginCollectionItem 中使用的所有内容都必须位于部分视图中。所以你的解决方案可能是这样的:
主视图
@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++)
{
@Html.Partial("name", item)
}
</tbody>
</table>
<br />
<a href="javascript:void(0)" class="addFixed">Add Another</a>
</fieldset>
Run Code Online (Sandbox Code Playgroud)
部分视图“名称”
@model Monet.Models.BankListMaster
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>
}
Run Code Online (Sandbox Code Playgroud)
这不是完整的解决方案,但你必须这样做,它对我有用。希望这会有所帮助!
| 归档时间: |
|
| 查看次数: |
2178 次 |
| 最近记录: |