2010-01-10 60 views
1

我很難得到一個相當簡單的綁定工作。asp.net mvc 2多選列表框。如何讀取控制器中的值

編輯員工時我想顯示一個包含系統中所有可用角色(選擇員工的角色)的列表框,並且在保存員工時,我希望所選角色由MVC填充到Employee對象中作爲控制器的輸入參數。

我知道我可以從Request.Form中讀取逗號分隔的值,但我寧願不直接在我的控制器中觸摸Request對象,因爲這會使它們更難測試。

什麼是讓MVC提供角色列表作爲輸入參數的最佳方式?

回答

1

您有兩種選擇。首先是獲取值的控制器和把它們放到ViewData字典,像這樣:

<%= (List<EmployeeRoles>)ViewData["EmployeeRoles"] %> 

這種方式是怎麼樣的醜陋:

var list = EmployeeRoles.GetAll(); 
ViewData["EmployeeRoles"] = list; 

然後你使用訪問它的視圖因爲視圖然後必須知道它可以使用'魔術字符串'從ViewData字典中獲取對象,然後該字典必須被轉換回其原始類型。

第二種方式更優雅,但在代碼中引入了更多複雜性。您創建一個視圖模型類,或者基本上是一個類,它將所有你想要的數據:

public class EmployeeViewModel 
{ 
    public Employee Employee { get; set; } 
    public ICollection<EmployeeRoles> EmployeeRoles { get; set; } 

    public EmployeeViewModel(Employee employee, ICollection<EmployeeRoles> roles) 
    { 
     Employee = employee; 
     EmployeeRoles = roles; 
    } 
} 

那麼你會從控制器傳遞到視圖像這樣:

return View(new EmployeeViewModel (employee, roles); 

在觀察側,你訪問它像任何其他型號:

<%= Model.Employee.Name %> 
<%= Model.EmployeeRoles.First() %> 

這種方法更容易測試,但你不得不做出新的ViewModel類的東西,從多個源需要數據。

至於從視圖返回到控制器的數據,默認的模型聯編程序實際上是相當不錯的。您只需在視圖上使用HtmlHelper即可知道它應該將值發回。我沒有我在我面前的書,現在,但它應該是這樣的一個文本框:

<% Html.TextBox("Name", Model.Employee.Name) %> 

HtmlHelper會找出它需要發回爲了使模型粘結劑將其正確綁定。儘管我不知道什麼是DropDownBox

相關問題