2011-05-12 48 views
2

我拉我的頭髮在這裏。我使用MVC3的DropDownListFor HTML輔助用枚舉,像這樣:奇怪的DropDownListFor/SelectListItem問題沒有設置默認值

@Html.DropDownListFor(model => model.Title, Enum.GetValues(typeof(ICS_Signup_Form.Models.Titles)).Cast<ICS_Signup_Form.Models.Titles>().Select(x => new SelectListItem { Text = x.ToString().ToFriendlyString(), Value = x.ToString() }), new { @class = "styled" })

我枚舉看起來像這樣:public enum Titles { Mr, Dr, Miss, Mrs, Ms, Other };

如果Model.Title等於「其他」,然後在下拉列表中沒有選擇這個值,HTML中沒有selected="selected"。我已經嘗試將:Selected = (x.ToString() == Model.Title)的屬性Selected添加到SelectListItem,並且表達式正常工作,但是所選值始終爲「Mr」(列表中的第一個)。

這工作完全正常什麼是更加古怪(如做其他7個下拉框我已經在我的項目):

@Html.DropDownListFor(model => model.BusinessStatus, Enum.GetValues(typeof(ICS_Signup_Form.Models.BusinessTypes)).Cast<ICS_Signup_Form.Models.BusinessTypes>().Select(x => new SelectListItem { Text = x.ToString().ToFriendlyString(), Value = x.ToString() }), new { @class = "styled" })

隨着枚舉:public enum BusinessTypes { Charity, Government, Limited, LLP, Partnership, PLC, SoleTrader };

的區別?沒有..任何想法?

+0

這很難說,但由於某種原因平等是關閉...可能是因爲在字符串中的編碼,或可能存在,拋出它關閉標題另一個字符...你試試將標題寫出到瀏覽器並驗證它與av匹配Alue 100%? – 2011-05-12 13:09:43

+0

是的,它從瀏覽器輸出和數據庫中匹配100%。 – eth0 2011-05-13 09:49:59

回答

3

tldr;將您的DropDownList的名稱更改爲其他東西

我有同樣的問題(雖然在ASPX引擎,我相信在這種情況下沒有任何區別)。以下是如何攝製它:

代碼隱藏(注意 「選定=真」 中的第二項):

List<SelectListItem> teams = new List<SelectListItem>(); 
teams.Add(new SelectListItem { Text = "Slackers", Selected = false, Value = "0" }); 
teams.Add(new SelectListItem { Text = "Workers", Selected = true, Value = "1" }); 
ViewData["teams"] = teams; 

的ASPX代碼:

<%: Html.DropDownList("team", (IEnumerable<SelectListItem>)ViewData["teams"]) %> 

它reproes:可以看到第一個項目被自動選中,並且這兩個項目都沒有HTML中的「selected」選項。下面是該reproes它生成的HTML:

<select id="team" name="team"> 
<option value="0">Slackers</option> 
<option value="1">Workers</option> 
</select> 

解決方案:原來一些元素名稱引起ASPX渲染引擎不同的行爲。就我而言,我只是從「團隊」改變了DropDownList的名稱爲「defaultteam」 - 它開始工作:

這裏的WORKING ASPX代碼:

<%: Html.DropDownList("defaultteam", (IEnumerable<SelectListItem>)ViewData["teams"]) %> 

,並在這裏被生成的HTML它:

<select id="defaultteam" name="defaultteam"> 
<option value="0">Slackers</option> 
<option selected="selected" value="1">Workers</option> 
</select> 
+0

我也一樣,這是非常奇怪的!謝謝您的幫助。 – Peter 2012-01-13 15:42:45

1

這很奇怪。我無法再現。這是我的工作代碼。

型號:

public enum Titles { Mr, Dr, Miss, Mrs, Ms, Other }; 

public class MyViewModel 
{ 
    public Titles Title { get; set; } 
} 

控制器:

public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     var model = new MyViewModel 
     { 
      Title = Titles.Other 
     }; 
     return View(model); 
    } 
} 

檢視:

@model MyViewModel 

@Html.DropDownListFor(
    model => model.Title, 
    Enum.GetValues(typeof(Titles)) 
     .Cast<Titles>() 
     .Select(x => new SelectListItem 
     { 
      Text = x.ToString(), 
      Value = x.ToString() 
     }), 
    new { @class = "styled" } 
) 

正如預期的那樣,Other是預選:

<select class="styled" id="Title" name="Title"> 
    <option value="Mr">Mr</option> 
    <option value="Dr">Dr</option> 
    <option value="Miss">Miss</option> 
    <option value="Mrs">Mrs</option> 
    <option value="Ms">Ms</option> 
    <option selected="selected" value="Other">Other</option> 
</select> 

您可能還會發現following extension method有用。

+0

我非常困惑,它肯定是個bug。我有人檢查我的代碼,他們也一樣困惑。我已經訴諸手動HTML,它工作正常... – eth0 2011-05-13 09:49:14

+0

@ eth0,你能給我一些示例項目說明問題? – 2011-05-13 10:00:07