2009-05-21 33 views
0

"CountryId"(int)と "Description"(string)の2つのプロパティを持つ(匿名型から)SelectListを使用して、DropDownListを作成しました。リストの選択した国をdefaultCountryにします。DropDownList SelectedValueが適切にバインドされていません

ここで、 "countries"は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> 

これは素晴らしいですし、私はページをロードする際、正しい国が選択されている国は、ビューモデルのパブリックプロパティです。

しかし、コントローラのEditメソッドに変更を送信すると、バインドが失敗するようです。私は、次の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"(TextBox 1st)パラメータを使用すると仮定します。しかし、DropDownListの最初のパラメータは "Contact.CountryId"ではなく "CountryId"です。これが選択されている場合、選択した値はロード時にリストに表示されないためです。

TextBoxの最初のパラメータはデータバインディング用で、DropDownListの最初のパラメータは選択したアイテムを検索するようです。

このデータバインディングのスタイルを使用して、DropDownListで必要な値を選択し、それをModel.Contact.Countryに関連付けますか?

答えて

3

ドロップダウンリストから選択した値を手動でバインドする必要があります。実際には、POSTで呼び出されるコントローラーアクションでバインドする必要があるエンティティのルックアップを実行する必要があります。 2番目の投稿に示唆したように、ViewModelに強く型付けされた値を使用することも、ViewDataバッグのドロップダウンリストの値を検索することもできます。

ほとんどすべてが整っていますが、POSTを処理するコントローラアクションでは、ドロップダウンリストの値を取得し、その値に関連付けられたエンティティをロードしてから、そのエンティティを更新しようとしているオブジェクトあなたのアーキテクチャにもよりますが、しばしばリポジトリまたはデータアクセスサービスへの単純な呼び出しです。作業中のメインオブジェクトの変更を永続化する前に、手動バインディングを実行します。

1

それはおそらく利用できる最もエレガントな解決策ではないのですが、私はこれをしなかった方法では、手動でのActionResultでオブジェクトを選択した値を設定することでした:

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

よりよい解決策は、おそらくそこにあるように私は感じますしかし、私はそれが何であるか分からない。

0

私は本当にそれが理想だとは思わないが、別の方法も見つかりました!

ビューモデルにCountryIdを追加し、それを使用して選択した項目を設定すると、変更時にその項目が設定されます。

それから私

contact.CountryId = Model.CountryId 

はまだ非常に良い感じがしないでください。

関連する問題