MVC下拉列表不会显示存储的值

时间:2014-02-06 16:14:50

标签: jquery asp.net-mvc razor

我已经浏览了很多帖子和一些关于如何在MVC和Razor中创建下拉列表的示例,而不是很清楚我的问题。

基本上我有这行代码可以创建我的下拉列表

@Html.DropDownListFor(model => model.MarketSegmentID,
                               new SelectList(""),
                               new { @class = "dropdownList"})

然后使用JQuery,我用控制器中的值填充下拉列表

然后我发布我的表单,下拉菜单中的选定值会正确显示。

我遇到的问题是当我打开表单备份时,我无法从模型中获取我保存的值以显示为所选值。

为了好玩,我添加了这行代码,它显示了我保存的值。

@Html.EditorFor(model => model.MarketSegmentID)

任何想法我做错了什么?

2 个答案:

答案 0 :(得分:0)

除非您真正需要填充SelectList客户端,否则最好将您的SelectList值直接放入控制器中的ViewBag.MarketSegmentId属性中并使用:

@Html.DropDownListFor(model => model.MarketSegmentID)

甚至只是

@Html.DropDownList("MarketSegmentID")

在控制器中你会有这样的东西(根据你自己的数据而变化):

ViewBag.MarketSegmentID = new SelectList(someDataList, "ValueProperty", "NameProperty");

someDataList可以是任何集合(例如数据库表,列表等)。 “ValueProperty”是数据中包含要存储的值的属性的名称(通常是int值)。 “NameProperty”是数据中属性的名称,用于保存要在每个项目上显示的文本。

假设您想要一个按顺序生成的简单整数列表,您可以将它们添加到这样的循环中:

List<int> ints = new List<int>();
for (int i = 0; i < 100; i++)
{
    ints.Add(i);
}
ViewBag.MarketSegmentID = new SelectList(ints);

如果SelectList构造函数中没有指定属性名称,它将只使用集合中的元素来显示和值。

MVC将自动在与模型属性同名的SelectList属性中查找ViewBag。例如假设Model.MarketSegmentID为选定值,并假设ViewBag.MarketSegmentID保留匹配的SelectList

当页面显示时,它还会从视图模型中填充当前选择,并从列表中的选择更新返回的视图模型值。

如果您描述数据类型,我可以更新它以显示在控制器中填充SelectList的具体示例。

答案 1 :(得分:0)

这就是我用来做的事情:

剃刀:

@Html.DropDownListFor(m => m.MarketSegmentID , Model.GetMarketSegmentList, new { @class = "form-control" })

视图模型:

public int? MarketSegmentID { get; set; }
public List<SelectListItem> GetMarketSegmentList { get; set; }

控制器:

var vm = new ViewModelWhatever();
[..]
vm.GetMarketSegmentList = GetMarketSegmentList()
                          .ToList()
                          .Select(x => new SelectListItem()
                          {
                              Value = x.MarketSegmentID.ToString(),
                              Text = x.Name
                          })
                          .ToList();