我正在尝试使用Html.NameFor<>
方法生成元素名称,这是我的代码:
@foreach (var category in Model.Categories)
{
<input type="hidden" name="@Html.NameFor(m=> category.CategoryId)"
value="@category.CategoryId" />
}
生成的项目name
获取此值:category.CategoryId
,而不是Categories[i].CategoryId
(其中i
指的是当前的索引器)。
为什么不起作用?
答案 0 :(得分:3)
简而言之,使用for循环而不是foreach循环(请参阅此处的答案)。您需要手动索引它
MVC Razor view nested foreach's model
编辑:添加了示例代码
@for(int i=0; i < Model.ListTwo.Count; i++)
{
@Html.HiddenFor(t => t.ListTwo[i].Id)
}
好的,对于从ICollection继承的集合,请尝试
@for (int i = 0; i < Model.CollectionThree.Count; i++)
{
@Html.Hidden("CollectionThree[" + i + "].Id", Model.CollectionThree.ElementAt(i).Id)
}
另一个编辑: 为避免使用属性名称,您可以执行类似
的操作@for (int i = 0; i < Model.CollectionThree.Count; i++)
{
@Html.Hidden(Html.NameFor(t => Model.CollectionThree) + "[" + i + "]." +
Html.NameFor(t =>Model.CollectionThree.ElementAt(i).Id)
,Model.CollectionThree.ElementAt(i).Id )
}
它不优雅,但它不会对属性名称进行硬编码。
然后让那些人离开循环
@{
var collectionname = Html.NameFor(t => Model.CollectionThree);
var propname = Html.NameFor(t => Model.CollectionThree.First().Id);
}
@for (int i = 0; i < Model.CollectionThree.Count; i++)
{
@Html.Hidden( collectionname+ "[" + i + "]." + propname ,Model.CollectionThree.ElementAt(i).Id )
}
我很抱歉没有早点回复。我退出了,因为我有其他事情要做。您也可能想要进行空检查,即,如果计数&gt; 0,然后分配propname,否则跳过整个事情
答案 1 :(得分:1)
根据user1778606's answer,我将使用道具。名称和索引器分开,如下所示:
@{
var modelName = Html.NameFor(m => m.Categories);
var catIndex = 0;
}
@foreach (var category in Model.Categories)
{
<input type="hidden" class="checkbox"
name="@string.Format("{0}[{1}]", modelName, catIndex++)"
value="@category.CategoryId" />
}
答案 2 :(得分:0)
使用@Html.HiddenFor
并传入CategoryId
@for(int i=0; i < Model.Categories.Count; i++)
{
@Html.HiddenFor(m => Model.Categories[i].CategoryId)
}