2011-02-17 127 views
1

我從一個枚舉中創建了一個SelectList。枚舉有一個描述,並且將int值設置爲我想要存儲在數據庫中的值。爲什麼我的下拉列表默認爲給定值?

問題是,我在施工上設置的默認(BLANK)沒有被使用。

這是我的枚舉:

public enum Stage 
{ 
    [Description("")] 
    BLANK = -99, 
    [Description("No Data")] 
    NoData = 9999, 
    [Description("Nil")] 
    Nil = 0, 
    [Description("Action")] 
    SAction = 1, 
    [Description("Action Plus")] 
    SActionPlus = 2, 
    [Description("Full")] 
    Full = 3 
} 

我在我的控制器創建它:

private static IEnumerable<SelectListItem> GenerateSenStageList() 
{ 
    var values = from Stage e in Enum.GetValues(typeof(Stage)) 
       select new { ID = (int)e, Name = e.ToDescription() }; 

    return new SelectList(values, "Id", "Name", (int)Stage.BLANK); 
} 

如果我想設置所選項目的最後一個參數。 我將其指定爲ViewData的,和訪問它像:

<%= Html.DropDownList("Stage", (IEnumerable<SelectListItem>)ViewData["StageList"])%> 

然而,無總是選擇值。

我在這裏錯過了什麼?

謝謝!

回答

1

Iainie,

使用你的代碼,我設法得到這個工作的第一次。這裏的(使用測試的AccountController)我修改的代碼[使用.NET 3.5]:

// from account controller - put the enum, etc in there for brevity 
public enum Stage 
{ 
    [Description("")] 
    BLANK = -99, 
    [Description("No Data")] 
    NoData = 9999, 
    [Description("Nil")] 
    Nil = 0, 
    [Description("Action")] 
    SAction = 1, 
    [Description("Action Plus")] 
    SActionPlus = 2, 
    [Description("Full")] 
    Full = 3 
} 

public static IEnumerable<SelectListItem> GenerateSenStageList() 
{ 
    var values = from Stage e in Enum.GetValues(typeof(Stage)) 
       select new { ID = (int)e, Name = e.ToDescription() }; 

    var sellist= new SelectList(values, "Id", "Name", (int)Stage.BLANK); 
    return sellist; 
} 

public virtual ActionResult LogOn() 
{ 
    var res = GenerateSenStageList(); 
    ViewData["StageList"] = res; 
    return View(); 
} 

// the ToDescription() extension method 
public static class Extn 
{ 
    public static string ToDescription(this Enum value) 
    { 
     FieldInfo fi = value.GetType().GetField(value.ToString()); 

     var attributes = 
      (DescriptionAttribute[])fi.GetCustomAttributes(
      typeof(DescriptionAttribute), 
      false); 

     if (attributes != null && 
      attributes.Length > 0) 
      return attributes[0].Description; 
     else 
      return value.ToString(); 
    } 
} 

// then in the LogOn view: 
<%= Html.DropDownList("Stage", (IEnumerable<SelectListItem>)ViewData["StageList"])%> 

這一切工作完全按照你希望的,所以我不知道如果從視圖中的調用被莫名其妙地越來越有點欺騙。試試我上面的例子,看看在選擇列表生成的代碼是否有任何細微的差異等。

2

最後一個參數確定所選值。但是,您要傳遞一個Stage枚舉值作爲最後一個參數,而列表的實際元素由一個ID值構成一個Stage值。要做到這一點,您必須將values中的實際對象傳遞給階段值BLANK。

+0

如果這是真的,那麼我很驚訝。我認爲int的值(在這種情況下ID)類型將正確匹配選定的值也是int。有趣。 – Tx3 2011-02-17 08:48:41

+0

但是選定的值不是int類型的。這是一個匿名類型包含一個int和一個階段 – 2011-02-17 08:58:35

1

只是一個猜測,但:

你投了ViewData["StageList"]IEnumerable<SelectListItem>。該枚舉可能是您在控制器中創建的SelectList,但它沒有SelectedValue屬性。

也許它適用,如果你將ViewData["StageList"]改爲SelectList而不是?

<%= Html.DropDownList("Stage", (SelectList)ViewData["StageList"])%> 

在這種情況下使用的界面可能是錯誤的事情,因爲你實際上需要由SelectList對象提供的信息。

+0

感謝您的答案 - 我已經改變它,但沒有喜悅... – laura 2011-02-17 09:51:18

0

@Ken Wayne VanderLinde是正確的。如果你使用C#4.0,那麼你可以這樣做來填充選定的值:

private static IEnumerable<SelectListItem> GenerateSenStageList() 
{ 
    var values = from Stage e in Enum.GetValues(typeof(Stage)) 
     select new { ID = (int)e, Name = e.ToDescription() }; 
    return new SelectList(values, "Id", "Name", values.Cast<dynamic>().Where(x => (x.ID == (int)Stage.BLANK))); 
}