2011-07-07 99 views
1

好的,這應該是一個問題,需要幫助讓我的表單正常工作。在創建要發佈的示例的過程中,我找出了修復的內容。ModelBinding選擇列表和選定項目的枚舉值

因此,現在它成爲一個問題,爲什麼它的工作方式,而不是其他。我真的無法理解這種行爲。我在MVC中發現了一個錯誤嗎?或者是有什麼我不明白的HTML請求,使這種行爲正確?

的例子invloves通過在從查詢字符串綁定視圖模型一個枚舉屬性設置在下拉列表中選擇的值(這是probaly更清楚我在說什麼樣,如果你剛纔讀的代碼):

控制器/型號

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> 

這很簡單。

問題是,爲什麼第二個「狗」鏈接不能正常工作?請注意,它將enumValue作爲數字屬性提交,而不是作爲「字符串」屬性。

但是模型活頁夾對此沒有任何問題。 提供給View的模型在的情況下完全相同。那麼下拉選擇值在一種情況下如何正確呈現,而不是其他情況?

回答

0

DropDownListFor用於查看modelstatedictionary以獲取字段/屬性的當前值。 第二個鏈接的ValueProviderResult的值爲1.

模型綁定器知道請求的類型是TestEnum。 1可以轉換爲狗。 dropwdownlist將ValueProviderResult的值轉換爲字符串。 1以字符串形式轉換爲「1」。選擇列表中沒有值爲「1」的條目。

因此,下拉列表有錯誤的當前值。