我是MVC的新手(您很快就能从我的代码中了解到)。 我的问题是绑定没有按照我的希望工作,因为在for循环中有一个for循环,我不知道如何让它工作。
我有一个页面显示OVERALL对象,所有与OVERALL关联的ASSET,然后是与每个ASSET关联的所有PORT。用户也可以编辑其中的一些字段。即它是一个VIEW中的索引和编辑。
我在我的httpget索引控制器中成功填充了名为OVERALL的模型。 我通过我的视图在屏幕上显示数据,它的工作原理。
但是当我点击我的'验证'按钮进入我的httpost索引控制器时,我的pList只包含与aList中第一个条目相关的5个条目,而不是所有20个条目(每个ASSET有5个PORTS,有4个资产总额(OVERALL)。 oList和aList具有正确的值。
我的控制器:
[HttpPost]
public ActionResult Index(OVERALL oList, IList<ASSET> aList, IList<PORT> pList)
我认为这是因为绑定不起作用,因为在我的视图中for循环中存在for循环,这会使绑定的名称/ id混淆,但我不知道如何解决它。
我应该为端口列表中的每个项目指定输入名称吗?
我应该完全重写这个,因为我做错了。我的最终目标是将我的OVERALL对象(包括连接的集合)中的所有数据传递给我的httppost索引控制器?
以下是我的一些观点:
@model Models.OVERALL
<div>
<hr />
<dl class="dl-horizontal">
@Html.HiddenFor(model => model.OVERALLID)
<dt>
@Html.DisplayNameFor(model => model.EMAIL_SEND_DATE)
</dt>
<dd>
@Html.HiddenFor(model => model.EMAIL_SEND_DATE)
@Html.DisplayFor(model => model.EMAIL_SEND_DATE)
</dd>
<dt>
@Html.DisplayNameFor(model => model.SENDER_ID)
</dt>
<dd>
@Html.HiddenFor(model => model.SENDER_ID)
@Html.DisplayFor(model => model.SENDER_ID)
</dd>
@Html.HiddenFor(model => model.ASSET)
<dd>
<table class="table">
@for (int i = 0; i < Model.ASSET.Count(); i++)
{
@Html.HiddenFor(x => x.ASSET.ToList()[i].OVERALLID)
<tr>
<td>
@Html.HiddenFor(x => x.ASSET.ToList()[i].ASSETID)
@Html.DisplayFor(x => x.ASSET.ToList()[i].ASSETID)
</td>
<td>
@Html.HiddenFor(x => x.ASSET.ToList()[i].ASSET_CLASS)
@Html.DisplayFor(x => x.ASSET.ToList()[i].ASSET_CLASS)
</td>
<td>
@Html.EditorFor(x => x.ASSET.ToList()[i].NEW_FUNDS_TO_BE_INVESTED)
</td>
</tr>
@Html.HiddenFor(x => x.ASSET.ToList()[i].PORT)
for (int j = 0; j < Model.ASSET.ToList()[i].PORT.Count(); j++)
{
<tr>
@Html.HiddenFor(y => y.ASSET.ToList()[i].PORT.ToList()[j].ASSETID)
<td>
@Html.HiddenFor(y => y.ASSET.ToList()[i].PORT.ToList()[j].PORTID)
@Html.DisplayFor(y => y.ASSET.ToList()[i].PORT.ToList()[j].PORTID)
</td>
<td>
@Html.HiddenFor(y => y.ASSET.ToList()[i].PORT.ToList()[j].PORTFOLIO)
@Html.DisplayFor(y => y.ASSET.ToList()[i].PORT.ToList()[j].PORTFOLIO)
</td>
<td>
@Html.EditorFor(y => y.ASSET.ToList()[i].PORT.ToList()[j].NEW_TARGET)
</td>
</tr>
}
}
</table>
</dd>
</dl>
</div>
这是我的类(首先使用EF数据库自动构建): 每个OVERALL都有很多ASSET,每个ASSET都有很多PORT。
public partial class OVERALL
{
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
public OVERALL()
{
this.ASSET = new HashSet<ASSET>();
}
public decimal OVERALLID { get; set; }
public DateTime? EMAIL_SEND_DATE { get; set; }
public string SENDER_ID { get; set; }
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
public virtual ICollection<ASSET> ASSET { get; set; }
}
public partial class ASSET
{
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
public ASSET()
{
PORT = new HashSet<PORT>();
}
public decimal ASSETID { get; set; }
public string ASSET_CLASS { get; set; }
public decimal? NEW_FUNDS_TO_BE_INVESTED { get; set; }
public decimal OVERALLID { get; set; }
public virtual OVERALL OVERALL { get; set; }
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
public virtual ICollection<PORT> PORT { get; set; }
}
public partial class PORT
{
public decimal PORTID { get; set; }
public string PORTFOLIO { get; set; }
public Nullable<decimal> NEW_TARGET { get; set; }
public decimal ASSETID { get; set; }
public virtual ASSET ASSET { get; set; }
}