使用@ Html.DropDownListFor显示ViewModel值

时间:2014-11-25 16:43:48

标签: asp.net-mvc asp.net-mvc-5

假设我的数据库有一个参考表,它将值ZebraGoatDog映射到键01和{ {1}}和DropDownList,用户可以在其中选择其中一个值。

2

用户选择保存到数据库后,我正试图找出一种显示@Html.DropDownListFor( m => m.Animal, new SelectList( new List<Object>{ new {value = 0, text = "Zebra"}, new {value = 1, text = "Goat"}, new {value = 2, text = "Dog"} }, "value", "text" ), new { @class = "form-control" } ) 值的方法。它保存为m => m.Animal,但我希望显示的文字为2。如何在@ Html.DropFownListFor上设置默认选择值等于用户的选择(例如Dog),因此所选项目显示文本2

1 个答案:

答案 0 :(得分:2)

我发现你的问题有两种可能的含义,所以我想我只会覆盖它们。

如果您正在谈论让下拉菜单显示正确的选定值,Razor应该为您解决此问题。但是,您在不指定SelectList参数的情况下定义实际selectedValue对象的事实可能会妨碍您。从技术上讲,DropDownListFor只需要IEnumerable<SelectListItem>,而不是实际的SelectList,并且通常更好地将其传递给前者,因为它更容易且更不容易出错:

@Html.DropDownListFor(
    m => m.Animal,
    new List<SelectListItem> {
       new SelectListItem { Value = "0", Text = "Zebra" },
       new SelectListItem { Value = "1", Text = "Goat" },
       new SelectListItem { Value = "2", Text = "Dog" }
    },
    new { @class = "form-control" }
)

但是,如果您正在谈论如何在代码的某个稍后时间点将值2转换为Dog,那么您实际上应该使用类似枚举的内容。例如:

public enum Animals
{
    Zebra = 0,
    Goat = 1,
    Dog = 2
}

然后,将您的Animal属性更改为此类型:

public Animals Animal { get; set; }

最后,既然你正在运行MVC5,你可以使用:

@Html.EnumDropDownListFor(m => m.Animal, new { @class = "form-control" })

您甚至不需要传递选项列表,因为帮助程序只会从Animal属性键入的枚举中获取它们。

然后,当您想要显示所选动物类型时,您只需使用:

@Html.DisplayFor(m => m.Animal)

Dog或其设置的任何内容都将自动输出。