2012-10-09 52 views
1

我試圖在我的視圖中創建MultiSelectList,但在PartialView中的此行上拋出異常:沒有類型爲'IEnumerable <SelectListItem>'的ViewData項具有鍵'RegisterModel.SelectedRoles'

@Html.ListBoxFor(x => x.RegisterModel.SelectedRoles, Model.RegisterModel.Roles) 

有型 '的IEnumerable' 具有關鍵 'RegisterModel.SelectedRoles' 沒有ViewData的項目。

我想MultiSelectList是一個所有角色的列表,但我不太確定我做錯了什麼。我最初製作RegisterModel.SelectedRoles a string[],因爲當向角色添加用戶時,string[]預計作爲System.Web.Security.Roles.AddUserToRoles()的參數。

型號

public class DynamicActionUserModel { 
    public string Action { get; set; } 
    public RegisterModel RegisterModel { get; set; } 
} 

public class RegisterModel { 
    public string[] SelectedRoles { get; set; } 
    public MultiSelectList Roles { get; set; } 
} 

控制器

[HttpGet] 
public ActionResult CreateUser() { 
    DynamicActionUserModel model = new DynamicActionUserModel { 
     Action = "CreateUser", 
     RegisterModel = new RegisterModel { 
      Roles = new MultiSelectList(System.Web.Security.Roles.GetAllRoles().OrderBy(r => r)) 
     } 
    }; 

    return PartialView("_UserPartial", model); 
} 

查看

<div> 
    @Html.Partial("_UserPartial", new DynamicActionUserModel{ Action = "CreateUser", RegisterModel = new RegisterModel()}) 
</div> 

霸rtialView

@Html.LabelFor(x => x.RegisterModel.Roles) 
@Html.ListBoxFor(x => x.RegisterModel.SelectedRoles, Model.RegisterModel.Roles) 
+0

在控制器中,你會初始化成員'Roles' ..但是在視圖中,你只是傳遞了一個新的'RegisterModel'實例而沒有初始化'Roles'列表。 –

+0

會如果我沒有在視圖中傳遞RegisterModel的新實例,控制器會被擊中?換句話說,是否有可能擊中控制器? – bflemi3

回答

2

在這條線正進行渲染_UserPartial部分,但你通過這個視圖的模型是空的,你只需實例化,但沒有角色中:

@Html.Partial("_UserPartial", new DynamicActionUserModel{ Action = "CreateUser", RegisterModel = new RegisterModel()}) 

CreateUser從未調用動作來填充Roles屬性。

你可能想調用它作爲一個孩子的動作:

<div> 
    @Html.Action("CreateUser") 
</div> 

現在CREATEUSER動作將被調用作爲一個孩子的行動,它將填充模型的角色屬性,並將其傳遞給部分。然後將執行該部分的結果注入包含<div>

查看following article以更好地瞭解Html.PartialHtml.Action之間的差異。

相關問題