我强烈建议您使用视图模型、强类型视图和编辑器模板。
因此,首先定义一个视图模型,其中包含视图可能需要的所有必要数据:
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()) %>
最后,您需要为模型中的每个元素执行的运河创建一个编辑器模板(〜/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循环。框架会自动处理一切,按照已经确定的惯例进行处理。