我有以下ASP MVC RAZOR代码:
@foreach (var prod in Model.allProducts)
{
<div class="accordion-group">
<div class="accordion-heading">
<a class="accordion-toggle" data-toggle="collapse" data-parent="accordion2" href="#collapse@(i)">
<h4 class="widgettitle" id="Title">> @prod.Description_VC</h4>
</a>
</div>
<div id="collapse@(i)" class="accordion-body collapse" style="height: 0px;">
<div class="accordion-inner" style="margin-left: 10px;">
<div style="padding-bottom: 10px;">
<strong>Total for product:</strong>
@Html.TextBoxFor(o => o.OfferHeaders.Where(p => p.Product_ID == prod.Product_ID).FirstOrDefault().Amount_DEC)
</div>
</div>
</div>
@{i++;}
<div style="clear:both;"></div>
</div>
}
但是为每个TextBoxFor控件生成的HTML具有相同的Amount_DEC
名称,因此,当我尝试发布表单时,我的viewmodel中的所有属性都为null。如何确保我的HTML控件获得唯一的名称,以便模型绑定器可以在POST中使用它们?
答案 0 :(得分:2)
如果您的方法希望模型为IEnumerable<...>
,则可以使用Html.TextBox
帮助程序而不是Html.TextBoxFor
:
@Html.TextBox(string.Format("ModelName[{0}].ModelField", i), yourValueHere)
假设您的模型名称为ModelName
且其属性为ModelField
答案 1 :(得分:1)
您可以尝试使用以下内容替换TextBoxFor代码:
@for (int j = 0; j < o.OfferHeaders.Count(); j++)
{
if (o.OfferHeaders[j].Product_ID == prod.Product_ID)
{
@Html.TextBoxFor(o => o.OfferHeaders[j].Amount_DEC)
break;
}
}
这不是最好的解决方案,但它应该适用于你的情况。
答案 2 :(得分:0)
你可以这样做:
@Html.TextBoxFor(o => o.OfferHeaders
.Where(p => p.Product_ID == prod.Product_ID)
.FirstOrDefault().Amount_DEC,
//unique name set here
new { Name = "txt1" })