在foreach循环中的Razor生成器中的元素命名约定

时间:2013-06-08 23:28:41

标签: asp.net-mvc razor

我正在尝试使用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指的是当前的索引器)。

为什么不起作用?

3 个答案:

答案 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)
}