开发者

Why won't my drop down default to the given value?

开发者 https://www.devze.com 2023-02-11 04:48 出处:网络
I\'ve created a SelectList from a enum.The enum has a description, and the int value is being set to the value I want to store in the database.

I've created a SelectList from a enum. The enum has a description, and the int value is being set to the value I want to store in the database.

The problem is, the default (BLANK) I set on construction isn't being used.

This is my enum:

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
}

I create it in my controller:

private static IEnumerab开发者_如何学运维le<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);
}

Where I thought the final parameter set the selected item. I assign it as ViewData, and access it like:

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

However, Nil is always the selected value.

What am I missing here??

Thanks!


The last parameter does determine the selected value. However, you are passing a Stage enumerated value as the last parameter, while the actual elements of your list are made up of an ID value and a Stage value. To make this work, you have to pass it the actual object from values with a Stage value of BLANK.


Iainie,

Using your code, i managed to get this working first time. here's my amended code (using the accountcontroller for testing) [using .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"])%>

this all works exactly as you'd hoped for, so I'm wondering if your invocation from the view is somehow getting a bit fuddled. try my example above and see if there are any subtle differences in the selectlist generated code etc.


Just a guess, but:

You cast the ViewData["StageList"] to IEnumerable<SelectListItem>. That enumerable may be the SelectList that you created in the Controller, but it does not have the SelectedValue property.

Maybe it works if you cast ViewData["StageList"] to SelectList instead?

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

In this case using the interface may be the wrong thing, because you actually need the information provided by the SelectList object.


@Ken Wayne VanderLinde is right. If you are using C# 4.0, then you can do this to populate the selected value:

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)));
}
0

精彩评论

暂无评论...
验证码 换一张
取 消