2013-12-19 29 views
25

如果標題不清楚,道歉。ASP.NET MVC帶有列表屬性的模型的CheckBoxList

我想從ASP.NET MVC提交表單返回我的模型。

我的問題是幾乎相同this question,只是在不同的我沒有List<Model>但像模特:

public Model 
{ 
    string UserName {get; set;} 
    string Password {get; set;} 
    List<Roles> UserRoles {get; set;} 
} 

,我需要的作爲的UserRole複選框,該管理員可以從選擇時創建一個新用戶。我的問題是,我不確定如何對列表使用'@ Html.CheckBoxFor'。我試過這個:

@for (var i = 0; i < Model.UserRoles.Count();i++) 
{ 
    @Html.HiddenFor(model => model.UserRoles[i].RoleID) 
    @Html.CheckBoxFor(model => model.UserRoles[i].Selected) 
    @Html.LabelFor(model => model.UserRoles[i].Name) 
} 

它沒有任何工作 - 頁面上的每個標籤都是「名稱」,我的列表在POST中是空的。任何人都可以爲我提供任何指導嗎?

+3

這個MVC教程有一個很好的例子,在你的模型的視圖中使用複選框。在頁面的中間開始。 http://www.asp.net/mvc/tutorials/getting-started-with-ef-5-using-mvc-4/updating-related-data-with-the-entity-framework-in-an-asp- net-mvc-application –

回答

40

沒有必要去從剃刀離開的。

這個工作對我來說:

for (var i = 0; i < Model.UserRoles.Count(); i++) 
{ 
    var role = Model.UserRoles[i]; 
    @Html.HiddenFor(model => model.UserRoles[i].RoleId) 
    @Html.CheckBoxFor(model => model.UserRoles[i].Selected) 
    @Html.LabelFor(model=> model.UserRoles[i].Name, role.Name) 
} 
+4

這很不錯,但是一個小修正,即'LabelFor'應該與'CheckBoxFor'綁定在同一個事物上:'@ Html.LabelFor(model => model.UserRoles [i] .Selected,role.Name)' –

+0

'Name'在發佈後沒有獲得價值 –

+1

您可以在最後添加@ Html.HiddenFor(model => model.UserRoles [i] .Name)以獲得發佈後的Name值 –

9

請參閱下面的代碼,這種方式您不需要隱藏角色ID,當您爲用戶保存所選角色時,也不需要遍歷所有角色以查看選定的角色。

查看

@foreach (Roles info in Model.UserRoles) 
{ 
    <span> 
     <input type="checkbox" class="checkbox" name="selectedRoles" value="@info.RoleName" id="@infoRoleName" /> 
     <label for="@info.RoleName">@info.RoleName</label> 
    </span> 
} 

行動

[HttpPost] 
public ActionResult CreateUsers(Model model, string[] selectedRoles) 
{ 
     // 
} 
+1

你不需要使用原生HTML。一個控制器如何綁定兩個模型? – LiverpoolsNumber9

+3

我用過原生HTML。但你字面上*不能綁定兩個模型。你不能。你不能。你不能。 (我提到你不能)。如果可以的話,它會被稱爲「MsVC」。 – LiverpoolsNumber9

+1

hi @ LiverpoolsNumber9,如果你知道如何解決這個問題,你有沒有看到MVC視圖上的兩個提交按鈕?你會知道這是如何工作的。 – Lin

1

從視圖中的代碼,後應該能正常運行,提供您的文章操作是這樣的:

[HttpPost] 
public ActionResult Action(Model model) 
{ 
    return View(model); 
} 

即通過你的模型,在爲論據。

另外,還要確保你在看你的模型參考太:

@model YourNameSpace.Model 
+2

DisplayFor不會生成標籤html元素。 – LiverpoolsNumber9

+0

@ liverpoolsnumber9好點,我今天半睡着了。刪除了我答案的那一部分。 :) – hutchonoid

+0

好的。我同情:) – LiverpoolsNumber9

0

後的複選框,服務器列表,並得到檢查的項目
LINQ左加入列表,以檢查是否選中,產生的複選框,收到檢查列表

查看

List<eDurar.Models.tbl_ISOCetificate> ModList = db.tbl_ISOCetificate.ToList(); 

    var li = (from cert in db.tbl_ISOCetificate join comCert in db.tbl_CompCertificate on cert.Cert_id equals comCert.CompCer_id into jo from b in jo.DefaultIfEmpty() 
       select new {cert.Cert_id,cert.Cert_Name,chkd = b.CompCer_SerId==null?"":"checked"}).ToList(); 


    foreach (var item in li) 
    {  
     @:<div style="width: 30%; display: inline-block; margin: 1em"> 
     @:<input type="checkbox" @item.chkd name="CheckedCertificates" value="@item.Cert_id"> 
     @:<label>@item.Cert_Name</label> 
     @:</div> 
    } 

控制器

[HttpPost] 
    public ActionResult ManageSurveyGroup(int[] CheckedCertificates) 
    { 
     return View(); 
    }