Я бы настоятельно рекомендовал вам использовать модели представления, строго типизированные представления и шаблоны редактора.
Поэтому, как всегда, начните с определения модели представления, которая будет содержать все необходимые данные, которые могут понадобиться вашему представлению:
public class CanalViewModel
{
public string Name { get; set; }
public bool Selected { get; set; }
}
затем контроллер:
public class HomeController : Controller
{
public ActionResult Index()
{
var model = new[]
{
new CanalViewModel { Name = "canal 1", Selected = false },
new CanalViewModel { Name = "canal 2", Selected = true },
new CanalViewModel { Name = "canal 3", Selected = false },
new CanalViewModel { Name = "canal 4", Selected = false },
};
return View(model);
}
[HttpPost]
public ActionResult Index(IEnumerable<CanalViewModel> model)
{
return View(model);
}
}
и далее следует ~/Views/Home/Index.aspx
представление:
<%@ Page
Language="C#"
MasterPageFile="~/Views/Shared/Site.Master"
Inherits="System.Web.Mvc.ViewPage<IEnumerable<AppName.Models.CanalViewModel>>"
%>
<% using (Html.BeginForm()) { %>
<%= Html.EditorForModel() %>
<input type="submit" value="OK" />
<% } %>
и, наконец, вам понадобится шаблон редактора для канала, который будет выполняться для каждого элемента в модели (~/Views/Home/EditorTemplates/CanalViewModel.ascx
):
<%@ Control
Language="C#"
Inherits="System.Web.Mvc.ViewUserControl<AppName.Models.CanalViewModel>"
%>
<div>
<%= Html.HiddenFor(x => x.Name) %>
<%= Html.CheckBoxFor(x => x.Selected) %>
<%= Html.LabelFor(x => x.Selected, Model.Name) %>
</div>
Теперь, когда вы отправляете форму, внутри действия POST вы получите список всех каналов вместе с выбранным свойством, в зависимости от того, какие флажки выбрал пользователь.
Как вы видите, нам не нужны никакие ViewData, которые потребуют от вас выполнения некрасивых приведений в ваших представлениях, и вам не нужно писать какие-либо циклы foreach
в ваших представлениях. Все обрабатывается автоматически в рамках хорошо известных соглашений.