2014-02-06 58 views
1

我已经浏览了很多帖子和几个例子,用于在MVC和Razor中创建下拉列表的方式,而不是像解决我的问题。MVC下拉列表将不会显示存储的值

基本上我有这行代码创建我的下拉

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

然后与jQuery我填写下拉与值从控制器

然后我后我的形式,并在所选择的值下拉菜单正确显示。

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

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

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

任何想法我做错了什么?

+0

问:为什么你填充在jQuer中选择列表而不是通过控制器中匹配的'ViewBag.MarketSegmentId'? –

+0

...或使用ViewModel? –

+0

@AndréFigueiredo:他有一个ViewModel,你的意思是扩展它吗? DropDownLists不需要,因为它们已经连接到ViewBag中查看(请参阅下面的答案)。 –

回答

0

除非你有一个真正的需要来填充选择列表的客户端,你最好把你的价值观的SelectList直入控制器和使用ViewBag.MarketSegmentId属性:

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

甚至只是

@Html.DropDownList("MarketSegmentID") 

在控制器中,您将有这样的事情(发生变化,以适应自己的数据):

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

someDataList可以是任何集合(例如,数据库表,列表等)。 “ValueProperty”是数据中包含要存储的值的属性名称(通常是一个int值)。 “NameProperty”是数据中包含要在每个项目上显示的文本的属性名称。如果SelectList构造它将只使用元素没有指定属性名

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

假设你想要的整数的简单列表,按顺序产生,你可以在一个循环中这样将它们添加在显示和值的集合中。

MVC将自动在与模型属性同名的ViewBag属性中查找SelectList。例如Model.MarketSegmentID被认为是所选择的价值和ViewBag.MarketSegmentID假定持有匹配SelectList

这也将填充从在显示页面视图模型当前的选择,并从选择更新你的回报视图模型值名单。

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

+0

数据类型是int – user3036753

+0

@ user3036753:你的意思是一个简单的整数值列表,如0-100等? –

+0

它的ID是,所以它可以是1-10000,数据如下所示:粘合剂-1,B&C-2,涂料-3等 – user3036753

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(); 
+0

我不是说你不能这样做,我只是说MVC提供了一个更简单的方法,内置,通过使用与Selectlist属性相同的名称的ViewBag条目。然后,您可以继续使用数据模型,而不是引入额外的ViewModel来添加SelectList。 –