为什么我的下拉默认不会达到给定值?

时间:2011-02-17 08:34:19

标签: c# asp.net asp.net-mvc

我从枚举中创建了一个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"])%>

但是,Nil始终是选定的值。

我在这里想念的是什么?

谢谢!

4 个答案:

答案 0 :(得分:2)

最后一个参数确定所选值。但是,您将Stage枚举值作为最后一个参数传递,而列表的实际元素由ID值 Stage值组成。要使其工作,您必须从values传递实际对象,其舞台值为BLANK。

答案 1 :(得分:1)

只是一个猜测,但是:

您将ViewData["StageList"]投射到IEnumerable<SelectListItem>。可枚举的可能是您在Controller中创建的SelectList,但它没有SelectedValue属性。

如果您将ViewData["StageList"]转换为SelectList,可能会有效吗?

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

在这种情况下,使用接口可能是错误的,因为您实际上需要SelectList对象提供的信息。

答案 2 :(得分: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"])%>

这一切都完全符合你的期望,所以我想知道你从视图中的调用是否有点变得有点混乱。试试我上面的例子,看看selectlist生成的代码是否有任何微妙的差异。

答案 3 :(得分: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)));
}