本文轉自:http://www.cnblogs.com/season2009/archive/2012/09/17/2685007.html
單個Checkbox
針對single checkbox使用方法和textbox等並沒有太大區別, 代碼如下:
View:
<%= Html.CheckBoxFor(model => model.IsNeverExpired)%>
HTML生成:
<
input
id
=
"IsNeverExpired"
name
=
"IsNeverExpired"
type
=
"checkbox"
value
=
"true"
/>
<
input
name
=
"IsNeverExpired"
type
=
"hidden"
value
=
"false"
/>
|
Controller:
//創建 public override JsonResult Create(Credential model) { } //編輯 public override JsonResult Edit(string id, FormCollection formValues) { Credential model = repository.GetByID(Convert.ToInt32(id)); UpdateModel(model); }
上面生成的HTML有點奇怪, 為什么它會生成兩個控件呢?
因為如果只生成一個input, 系統無法區分"沒有選中checkbox" 和 "checkbox沒有生成".
那又是為什么只生成一個input就無法區分呢?
原來當一個form中包含checkbox時,如果沒有給它賦值(選中), 在服務器端Request.Form中得到的值是NULL
據說是標准的browser behaviour.
參見:http://forums.asp.net/t/1425806.aspx/1/10
多個Checkbox
當對象之間是多對多的關系時, 在數據庫中一般是通過建立一個中間表來映射, 如一個證件有多個專業(或一篇文章屬於多個Categorie)
此時CheckBox組就派上用場了. 由於並沒有類似Html.CheckBoxListFor這樣的方法, 我是通過如下方法實現的.
View:
<% foreach (var item in (MultiSelectList)ViewData["list"]) {%> <input type="checkbox" name="ProfessionalIDs" value="<%=item.Value%>" id="Professional<%=item.Value%>" <%=item.Selected ? "checked=\"checked\"" : String.Empty%> /> <label for="Professional<%=item.Value%>"><%=item.Text%></label> <%} %>
Controller:
View Code
public override ActionResult Create() { Credential model = new Credential(); model.InitProfessionalList(); ViewData["list"] = new MultiSelectList(model.Professionals.Items, "TypeID", "Name", null); return View(model); } [AcceptVerbs(HttpVerbs.Post)] public override JsonResult Create(Credential model) { if (model.ProfessionalIDs == null) { model.CredentialProfessional = new System.Data.Linq.EntitySet<CredentialProfessional>(); } else { foreach (int professionalID in model.ProfessionalIDs) { model.CredentialProfessional.Add(new CredentialProfessional() { CredentialID = model.CredentialID, ProfessionalID = professionalID }); } } ... } [AcceptVerbs(HttpVerbs.Post)] public override JsonResult Edit(string id, FormCollection formValues) { repository.Edit(model, formValues["ProfessionalIDs"]); ... }
Repository:
View Code
public StatusEnum Add(TEntity entity) { db.GetTable<TEntity>().InsertOnSubmit(entity); db.SubmitChanges(); return StatusEnum.Success; } public StatusEnum Edit(Credential model, string professional) { List<CredentialProfessional> newSelect = new List<CredentialProfessional>(); if (!string.IsNullOrEmpty(professional)) { string[] professionalArray = professional.Split(','); foreach (string professionalID in professionalArray) //新選擇的項保存到集合中 { newSelect.Add(new CredentialProfessional() { CredentialID = model.CredentialID, ProfessionalID = Convert.ToInt32(professionalID) }); } } model.CredentialProfessional.Except(newSelect).ToList().ForEach(n => db.CredentialProfessional.DeleteOnSubmit(n)); newSelect.Except(model.CredentialProfessional).ToList().ForEach(n => db.CredentialProfessional.InsertOnSubmit(n)); db.SubmitChanges(); return StatusEnum.Success; }
說明: CredentialProfessional就是中間表, 須以其2個外健做為聯合主健.
簽名:刪除冗余的代碼最開心,找不到刪除的代碼最痛苦!

