Я не знаю, с какой стати вы захотите вручную генерировать идентификаторы и имена ваших флажков вместо простого использования хелпера Html.CheckBoxFor
, который сделает все это за вас, но в случае, если у вас есть какие-то причины, вот как:
@{
var name = ViewData.TemplateInfo.GetFullHtmlFieldName("");
}
@foreach (string roleName in Roles.GetAllRoles())
{
string checkboxId = "checkbox_" + roleName;
<input type="checkbox" name="@name" id="@checkboxId" value="@roleName" @Html.Raw(Model.Contains(roleName) ? "checked" : "") />
<label for="@checkboxId">@roleName</label>
}
Очевидно, что это показано здесь чисто для некоторых образовательных целей.Я действительно избежал бы такого уродства и просто использовал бы помощники HTML и шаблоны редактора.Еще одна вещь, которая шокирует меня, на ваш взгляд, это следующая строка кода: Roles.GetAllRoles()
.Это как если бы ваш взгляд запрашивал данные.Это последнее, что должен сделать вид.Контроллер отвечает за запрос данных, заполнение модели представления и передачу этой модели представления в представление, чтобы оно просто отображало данные.
Итак, давайте попробуем разработать ваш пример.Из того, что я могу понять, вы пытаетесь показать список флажков для каждой роли, чтобы пользователь мог выбрать их.
Как всегда, вы начинаете с модели представления, выражающей ваши требования к представлениям:
public class MyViewModel
{
public IEnumerable<RoleViewModel> Roles { get; set; }
}
public class RoleViewModel
{
public string RoleName { get; set; }
public bool Selected { get; set; }
}
, затем вы пишете действие контроллера, которое будет запрашивать ваши данные и заполнять модель представления:
public ActionResult Index()
{
var roles = Roles.GetAllRoles();
var model = new MyViewModel
{
Roles = roles.Select(role => new RoleViewModel
{
RoleName = role,
Selected = ??????
})
};
return View(model);
}
тогда у вас будет Index.cshtml
представление:
@model MyViewModel
@Html.EditorFor(x => x.Roles)
и соответствующий шаблон редактора, который будет отображаться для каждого элемента коллекции ролей (~/View/Shared/EditorTemplates/RoleViewModel.cshtml
):
@model RoleViewModel
@Html.CheckBoxFor(x => x.Selected)
@Html.LabelFor(x => x.Selected, Model.RoleName)
Нет больше foreach
циклов в представлениях, больше нет отвратительных хаков с именами и идентификаторами, больше нет данных, извлекаемых из представлений.