2013-04-17 65 views
3

看起來這個問題被問了太多次。但是這讓我瘋狂。未在MVC4中的DropDownListFor()上設置的選定值

這是我的(簡化)模型。

public class UserEditModel 
{ 
    [Required] 
    public string Title { get; set; } 

    private IEnumerable<SelectListItem> _titleList; 
    public IEnumerable<SelectListItem> TitleList 
    { 
     get { return _titleList.Select(x => new SelectListItem { 
          Selected = (x.Value == Title), 
          Text = x.Text, 
          Value = x.Value 
         }); 
     } 
     set { _titleList = value; } 
    } 
} 

TextValueTitleList構件每個SelectListItem的性質是相同的。例如:

new SelectListItem { Text = "Mr", Value = "Mr" } 

當下面的代碼是張貼,正確Title值被綁定到模型,但每當該模型被推向視圖響應於POST或GET,所選擇的值不設置在下拉列表中,即使所有intellisense都顯示出正確的值。

@Html.DropDownListFor(x => x.Title, Model.TitleList) 

我已經確保基於幾篇文章和幾個SO答案的代碼是正確的,所以我很難過。

有什麼建議嗎?

更新:

爲了完整,這是操作和支持方法:

[HttpGet] 
public ActionResult Edit(int id) 
{ 
    var user = _userService.Get(id); 

    var model = new UserEditModel() 
    { 
     ... 
     Title = user.Title, 
     TitleList = ListTitles() 
    }; 

    return View(model); 
} 

private IEnumerable<SelectListItem> ListTitles() 
{ 
    var items = new[] { 
      new SelectListItem() {Text = "Mr", Value = "Mr" }, 
      new SelectListItem() {Text = "Mrs", Value = "Mrs"}, 
      new SelectListItem() {Text = "Ms", Value = "Ms"}, 
      new SelectListItem() {Text = "Miss", Value = "Miss"}, 
      new SelectListItem() {Text = "Professor", Value = "Professor"}, 
      new SelectListItem() {Text = "Dr", Value = "Dr" } 
     }; 

    return items; 
} 

正如你看到的沒有什麼特別的,只是一個簡單的實現。

+0

在您返回視圖之前嘗試添加'ModelState.Clear()'。 – mattytommo

+0

@mattytommo我爲什麼需要這樣做?你能把它作爲答案嗎? – Digbyswift

+0

看到我的答案,那就是爲什麼:) – mattytommo

回答

2

好吧,看起來代碼實際上沒有錯,只是模型中Title屬性的名稱。

它看起來像Title是一個保留字,用TitleX或更合適Salutation取代它使一切工作正常。

+0

謝謝小夥子。我有這個完全相同的問題 - 甚至使用與您相同的屬性名稱。剛剛花了幾個小時把頭髮拉出來。正如我們說的那樣:「多麼糟糕......」 – kenxl

+0

同樣的問題在這裏,必須抓住很多人。不過,我現在又下了一個選擇正確的值。我可以在模板中看到設置爲模型的值,但沒有被選中。其他所有下拉菜單都可以正常工作,我看不出代碼中的任何區別。 –

+0

http://stackoverflow.com/questions/2278056/dropdownlistfor-not-selecting-value 固定!我使用與模型屬性相同的名稱來分配一個ViewBag屬性,這顯然是一個很大的禁忌。 –

2

您需要在默認情況下,從一個動作後返回一個視圖時添加ModelState.Clear(),因爲它認爲它未通過驗證,那麼使用值ModelState在模型中的值。很多人認爲這其實是一個錯誤 MVC,但它的設計:

ASP.NET MVC假設如果你渲染視圖響應HttpPost,而你使用HTML助手,那麼你很可能會重新顯示驗證失敗的表單。因此,Html Helpers實際上會在ModelState中查看在模型中查看字段之前顯示的值。這使他們可以重新顯示用戶輸入的錯誤數據,並在需要時輸入匹配的錯誤消息。

Link

+0

問題不在於POST/ModelState。在POST或GET中,所選值不會被設置。我提到POST是爲了表明模型設置正確,因此不太可能成爲模型的問題。 – Digbyswift

+0

但是,謝謝你的解釋,這是有用的任何一種方式。 – Digbyswift

+0

@Digbyswift如果你可以在動作中看到它,它幾乎可以肯定是**'ModelState'。你有沒有嘗試添加'.Clear'? – mattytommo

0

你確定你在控制器中適當地檢索選擇列表的項目嗎? 對我來說它工作正常。 我會使用get方法而不是屬性(GetTitleList(string value)),以避免錯誤地將選擇列表放到代碼中。

+0

無論實現如何,如果代碼適合你,它應該爲我工作不應該嗎?是的,正如我在OP中所說的那樣,這些數值都是正確的。這是一個謎! – Digbyswift