asp.net mvc 3视图中foreach循环中每个元素的唯一ID?

时间:2011-03-21 05:24:04

标签: c# asp.net-mvc asp.net-mvc-3

我有一组ViewModel,我从控制器发送回视图

   public class CourseTableViewModel
    {
        public string Prefix { get; set; }
        public bool OwnerPremission { get; set; }
        public bool AddPermission { get; set; }
        public bool EditPermission { get; set; }
        public bool DeletePermission { get; set; }
        public bool ViewPermission { get; set; }
    }

所以我有一份这些

的清单
@foreach (var item in Model)
        {     
            <tr>
               <td>@Html.CheckBoxFor(x => item.OwnerPermission) </td>
               //.... rest here //
            </tr>

        }

这将循环X次,具体取决于VM的发送方式,但它们都具有相同的ID,我希望它们不同。

所以我做了这个

<td>@Html.CheckBoxFor(x => item.OwnerPremission,new {@disabled = "disabled", @id = PermissionTypes.Owner.ToString() + counter})</td>

我想知道是否有更好的方法。

修改

所以我做了模板方式(虽然显示没有编辑)并且在其中有

  <td>@Html.CheckBoxFor(x => x.OwnerPremission, new { @disabled = "disabled"})</td>

它为第一个渲染。

<td><input type="checkbox" value="true" name="[0].OwnerPremission" disabled="disabled" checked="checked"><input type="hidden" value="false" name="[0].OwnerPremission"></td>

没有id只是名字。为什么不显示?

1 个答案:

答案 0 :(得分:1)

您可以为此视图模型使用编辑器模板,以确保正确的idname属性。因此,假设您的主视图模型是CourseTableViewModel的集合或具有CourseTableViewModel集合的属性,您可以在主视图中执行以下操作:

@model IEnumerable<AppName.Models.CourseTableViewModel>
<table>
    <tr>
        @Html.EditorForModel()
    </tr>
</table>

并在相应的编辑器模板(~/Views/Shared/EditorTemplates/CourseTableViewModel.cshtml)中:

@model AppName.Models.CourseTableViewModel
<td>
    @Html.CheckBoxFor(x => x.OwnerPremission, new { @disabled = "disabled" })
</td>
...

将为视图模型集合中的每个项目执行编辑器模板,并避免在视图中编写任何循环。您只需要遵循这些模板的命名约定(它必须是called CourseTableViewModel.cshtml,因为这是主视图模型集合中使用的类型名称。)


更新:

在我提供的示例中,没有为复选框生成任何ID。您可以执行以下操作为每个复选框生成唯一ID:

@model AppName.Models.CourseTableViewModel
<td>
    @Html.CheckBoxFor(
        x => x.OwnerPremission, 
        new { 
            @disabled = "disabled",
            id = HtmlHelper.GenerateIdFromName("OwnerPremission." + ViewData.TemplateInfo.GetFullHtmlFieldName(""))
        }
    )
</td>