[轉]MVC Checkbox


本文轉自: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個外健做為聯合主健.

簽名:刪除冗余的代碼最開心,找不到刪除的代碼最痛苦!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM