我有一组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只是名字。为什么不显示?
答案 0 :(得分:1)
您可以为此视图模型使用编辑器模板,以确保正确的id
和name
属性。因此,假设您的主视图模型是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>