我會強烈建議您使用視圖模型,強類型的意見和編輯模板。
,以便始終通過定義將包含所有必要的數據視圖模型開始你的觀點可能需要:
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
循環。一切都由框架按照既定的慣例自動處理。