2011-07-07 11 views
1

これは、フォームが正しく機能するように助けを求める質問であるはずです。投稿するサンプルを作成する過程で、私はその修正が何であるかを理解しました。SelectListと選択した項目のModelBinding列挙値

だから、なぜそれが一方通行で、もう一方通じではないのかという疑問になる。私は本当にその行動を理解できません。私はMVCにバグを見つけましたか?または、HTMLのリクエストについてわからない何かがありますが、これは正しい動作をしますか?

クエリ文字列(それは私はあなただけのコードを読んでいる場合について話して何probaly明確だ)からバインドされたビューモデルで列挙型プロパティを使用してドロップダウンリストで選択した値を設定する例invloves:

コントローラ/モデル

public class HomeController : Controller 
{ 
    public ActionResult Index(TestModel model) 
    { 
     return View(model); 
    } 
} 

public class TestModel 
{ 
    public SelectList EnumOptions { get; set; } 
    public TestEnum EnumValue { get; set; } 

    public TestModel() 
    { 
     var options = from Enum e in Enum.GetValues(typeof(TestEnum)) 
         select new { Value = e, Name = e.ToString() }; 

     EnumOptions = new SelectList(options, "Value", "Name", TestEnum.NotSet); 
    } 
} 

public enum TestEnum 
{ 
    NotSet = 0, 
    Dog = 1, 
    Cat = 2 
} 

ビュー

@Html.DropDownListFor(m => m.EnumValue, Model.EnumOptions) 

<a href="?EnumValue=Dog">Dog numeric</a> 
<a href="?EnumValue=1">Dog string</a> 

それはとても簡単です。

問題は、なぜ2番目の「Dog」リンクが正しく機能しないのですか? 「文字列」プロパティではなく、数値プロパティとしてenumValueを送信することに注意してください。

しかしモデルバインダーはこれに問題はありません。 ビューに提供されるモデルは、いずれの場合も全く同じです。では、ドロップダウンの選択された値は、あるケースでは正しく表示されますが、他のケースでは正しく表示されません。

答えて

0

DropDownListForは、フィールド/プロパティの現在の値を取得するためのモデルステートメントを探します。 2番目のリンクのValueProviderResultの値は1です。

modelbinderは、要求されたタイプがTestEnumであることを認識しています。 A 1はDogに変換できます。 dropwdownlistは、ValueProviderResultの値を文字列に変換します。 A 1は文字列として "1"に変換されます。選択リストに「1」の値を持つ項目はありません。

そのため、ドロップダウンリストの現在の値が間違っています。