2009-05-21 126 views
0

我有填充有來自(匿名類型)所產生的的SelectList一個DropDownList具有兩個屬性「CountryId」(int)和「描述」(字符串)。我希望列表中的選定國家是defaultCountry。的DropDownList的SelectedValue不結合正常

Countries = new SelectList(countries, "CountryId", "Description", defaultCountry.CountryId); 

其中「國家」是匿名類型從LINQ查詢一個IQueryable。國家是一個視圖模型的公共屬性:

public class CountryBaseViewModel 
{ 
    public SelectList Countries { get; set; } 
    public Contact Contact { get;set; } 
    .... 
} 

的HTML看起來像這樣:

<p> 
<label for="CountryId">Home Country:</label> 
<%= Html.DropDownList("CountryId", Model.Countries)%> 
</p> 

這是好的,當我加載頁面,選擇正確的國家。

但是,當我將更改提交到控制器上的編輯方法時,綁定似乎失敗。

例如,當我使用下面的HTML

<p> 
<label for="Contact.Job">Job/Post:</label> 
<%= Html.TextBox("Contact.Job", Model.Contact.Job) %> 
</p> 

我調用該方法

public ActionResult Create(Contact contact) 

在控制器上,則contact.Job值是否正確填寫從文本框,但CountryId不是。

我相信MVC使用「Contact.Job」(文本框1)參數設置此。但是,DropDownList的第一個參數是「CountryId」而不是「Contact.CountryId」,因爲如果它是,那麼當我加載它時,所選值不會顯示在列表中。

它看起來像TextBox的第一個參數是數據綁定和DropDownList中的第一個參數是要找到所選擇的項目。

如何使用數據綁定來得到在DropDownList選定值我想要再扎,要Model.Contact.Country的這種風格?

回答

3

您必須從下拉列表中選擇的值手動綁定,這樣做無論哪個實體實際需要綁定到被調用的POST控制器動作查找。您可以像在第二篇文章中建議的那樣,在ViewModel中使用強類型值,或者可以查看ViewData包中的下拉列表的值。

因此,您擁有的所有東西都已到位,但在處理POST的控制器操作中,您需要獲取下拉列表的值,加載與該值關聯的實體,然後將該實體附加到您嘗試更新的對象。根據您的體系結構,它通常只是對存儲庫或數據訪問服務的簡單調用。在保持與您一起工作的主要對象的更改之前,您會執行手動綁定。

1

它可能不是市場上最優雅的解決方案,但我這樣做的方式是手動設置在的ActionResult對象上的選擇值:

contact.CountryID = Request.Form("CountryId") 

我覺得有可能是一個更好的解決方案,但我不知道它是什麼。

0

從另一方面也找到了,儘管我並不認爲它是理想的!

如果我添加一個CountryId到視圖模型,並用它來設置所選的項目,則當它改變填充。

然後我做

contact.CountryId = Model.CountryId 

仍然不會覺得很不錯。

相關問題