2017-04-11 38 views
0

童話的例行情況,我需要允許用戶從ASP.NET MVC應用程序中的Enum中選擇一個值。由於我使用的MVC版本5.2,我可以簡單地做到這一點:EnumDropDownListFor不選擇值,儘管值傳遞到視圖

// Model 
public MyEnum EnumVal { get; set; } 

// Controller 
return View(new MyModel{EnumVal = MyEnum.SomeVal}); 

// View 
@Html.EnumDropDownListFor(model => model.EnumVal) 

而這一切都只是神奇的作品。我已經做了足夠多的時間來認爲它是理所當然的。

但我剛剛注意到,我傳遞的值並未被選爲當前下拉值。

我可以吐出模型的內容來驗證該值是否正確傳遞,但下拉菜單中只有第一個值被選中。

其他答案(例如herehere)似乎證實了我認爲我知道的事情:我不應該再做任何事情來讓下拉選擇我已經通過的值。

我有腦屁嗎?爲什麼這不起作用?


更新

下面是控制方法的更完整的列表:

public ActionResult Create(string enumVal) 
{ 
    var valueToPass = AccountsDestination.QbDUk; 
    Enum.TryParse(enumVal, out valueToPass); 
    return View(new QuickBooksMappingViewModel(){EnumVal = valueToPass}); 
} 
+0

你顯示的代碼工作正常。有沒有可能導致問題的任何JavaScript?我假設控制器方法是一個GET,並且您不想嘗試更改POST中的值,或者您沒有爲GET方法中的'enum'指定參數。 –

+0

@StephenMuecke你釘了它!這是一個與獲得參數之一的名字衝突。重命名參數就是它所花費的。 (隨意將其升級爲答案,我將接受。) –

+0

您尚未顯示相關代碼 - 方法的簽名:) –

回答

3

的問題是,你的方法有一個參數enumVal(具有相同的名稱型號屬性)。該方法執行時,DefaultModelBinder將該參數的值添加到ModelState

在視圖中ModelState匹配(然後ViewData最後模型值),它發現,並嘗試設置選擇選項以在ModelState的值EnumDropDownListFor()方法首先檢查。有關這是默認行爲的解釋,請參閱TextBoxFor displaying initial value, not the value updated from code

在你的情況下,參數的值可能是第一個選項的值,或者與任何選項值不匹配(因爲必須是第一個選項被選中)。

請更改參數的名稱,使其與您的某個模型屬性不同,或者您可以使用ModelState.Clear();ModelState中刪除該值。