2013-04-10 144 views
3

我有一個表格中添加一個新用戶與用戶角色少數幾個複選框。我有我的行動稱爲用戶的模型,其具有以下特性:ASP.NET MVC:模型綁定半對象

public string Username { get; set; } 
public string Password { get; set; } 
public IEnumerable<UserRole> Roles { get; set; } 

的UserRole的類中,我有兩個特性:

public int Id { get; set; } 
public string Name { get; set; } 

在我的形式,我可以成功地綁定到用戶名和密碼沒有通過輸入名稱'用戶名'和'密碼'來解決問題。當頁面最初加載用戶角色的細節被加載,所以我需要返回的是Id,因爲這是服務需要將用戶與用戶角色相關聯的內容。

我以爲我可以通過給每個複選框的角色ID的價值和傳遞,在與角色,因此部分完成角色類和離開作用對象空白的名稱字段該做的簡單方法。一個例子複選框看起來像這樣:

<input type="checkbox" id="addUserAdministrator" name="Roles.Id" value="@Model.Roles.Where(role => role.Name == "Administrator").Select(role => role.Id).First()" class="css-checkbox"/> 

然而,這絕不填充角色集合,它始終是零。有沒有辦法做到這一點,或者我需要做一個漫長的方式來傳遞一個整數列表並在動作中創建模型?

編輯:

我的行動看起來是這樣的:

public RedirectToRouteResult Add(User user) 
+0

您是否使用了表單集合來檢索複選框中的值 – 2013-04-10 15:29:06

+0

我已更新我的問題,我正在嘗試綁定到該對象 – Serberuss 2013-04-10 15:31:22

+0

該操作需要用戶對象,但您似乎正在傳遞角色,可以你張貼整個表單代碼? – nik0lias 2013-04-10 15:38:19

回答

3

要麼你可以綁定原始類型的集合 - 使用

<input type="checkbox" id="addUserAdministrator" name="Roles" 
你的情況

public IList<Int> Roles { get; set; } //role id's here 

INT

或者如果你想要Roles集合,你應該明確地爲你的集合指定一個索引。閱讀this article。如果表格中列表中選定項目之間出現空白,最好使用非順序索引(例如,使用Guid.NewGuid())。

<input type="hidden" name="Roles.Index" value="@(GuidIndexForThisRow)" /> 
<input type="checkbox" name="Roles[@(GuidIndexForThisRow)].Id" value="1" /> 
+0

我試過了你的第二個建議,但是當我選擇了2個或多個複選框並提交了這些時,問題就出現了,只有一個(第一個)綁定到對象 – Serberuss 2013-04-10 15:48:31

+0

你爲每對隱藏的\複選框使用不同的guid?它應該是相同的成對,但在成對之間是唯一的。 – lavrik 2013-04-10 15:49:59

+0

我甚至無法使用隱藏/複選框對的GUID綁定到角色。如果我明確將名稱設置爲角色[0] .Id,但它將始終爲空,那麼它會綁定。 – Serberuss 2013-04-10 16:01:03

0

當我使用集合剃刀,我解決這個問題的方法:我使用的塊創建任何你想要的集合的索引中顯示一個新的複選框,文本框或,因爲當你調用控制器方法,該模型將綁定基於索引的Collection值。

試試這個: 1.創建一個布爾字段到你的角色的ViewModel,當選擇了一個角色就知道了。

@Html.TextBoxFor(model => model.Username) 
@Html.PasswordBoxFor(model => model.Password, new { value = Model.Password }) 

<ul id="roles"> 
@for (int I = 0; I < Model.Roles.Count(); ++I) 
{ 
    <li> 
     @Html.HiddenFor(model => Model.Roles[I].ID) 
     @Html.CheckBoxFor(model => Model.Roles[I].RoleSelected) 
     @Model.Roles[I].Name 
    </li> 
} 
</ul> 

嘗試類似這樣的東西。

+0

我不確定這會對我有效,因爲我有一個初始加載數據的模型和一個將數據傳遞給動作的不同模型,因爲這些模型有不同的信息 – Serberuss 2013-04-10 16:05:02

+0

這種方式將綁定您的視圖根據角色集合。無論您將值放入初始化中或更改此值,該循環都會顯示您當前的內容。 – Kiwanax 2013-04-10 16:31:32