2014-05-08 59 views
1

我正在循环播放模型,但来自模型的值与下拉列表中显示的选定项目不同。相反,列表总是只显示第一个条目。DropDownListFor()未设置为模型值

@Html.DropDownListFor(modelItem => item.RecordType, Model.RecordTypes, new { id="recordType_" + item.TransactionID }) 

item.RecordType在模型中的值为5(我打印出来,所以我知道它就是这个值)。然而,下拉显示“初始”(这是一个值4),而不是“公司”(这是5的价值,这是我们的模型项目价值)。源中的列表定义为:

<select data-val="true" data-val-number="The field RecordType must be a number." id="recordType_63" name="item.RecordType"> 
<option value="4">Initial</option> 
<option value="5">Firm</option> 
<option value="6">Announced</option> 
<option value="7">N/A</option> 
</select> 

如何将下拉列表设置为模型值?

public IEnumerable<SelectListItem> RecordTypes 
     { 
      //get { return new SelectListItem(recordTypes, "RECORD_TYPE_ID", "RECORD_TYPE"); } 
      get 
      { 
       return (from r in recordTypes 
         select new SelectListItem { Text = r.RECORD_TYPE, Value = r.RECORD_TYPE_ID.ToString() }); 
      } 
     } 
+0

你如何构建'Model.RecordTypes'? – DaveParsons

+0

编辑答案表明。我注意到的是SelectListItem需要2个字符串。我的记录具有整数值。不匹配导致问题?什么是最好的方式来处理,因为我会想象在所有数据库中,这些事情的id将被存储为整数,因为它们是,但在html中,它们似乎被视为字符串。在视图中,我无法在模型项目上执行ToString(),因为它对我的错误表示您无法像这样改变模型。 – user441521

回答

1

你可以通过在你的Html.DropDownListFor像创建一个SelectList

@Html.DropDownListFor(modelItem => item.RecordType, new SelectList(Model.RecordTypes, item.RecordType), new { id="recordType_" + item.TransactionID }); 

这通过您的IEnumerable<SelectListItem>到构造与参数一起,在这种情况下item.RecordType,让它知道哪些要选择的项目。


编辑:在回答评论

你可以使用的SelectList过载,它允许你指定你的情况DataTextFieldDataValueField这些将分别为TextValue

返工你Model.RecordTypes在那里返回SelectList并做必要的工作,你可以使用的方法和传递的价值选择。喜欢的东西:

public SelectList RecordTypes(object selectedValue) 
{ 
    return new SelectList(recordTypes, "RECORD_TYPE", "RECORD_TYPE_ID", selectedValue); 
} 

希望有所帮助。

+0

这似乎是合乎逻辑的,但我得到的是一个列表框,其中所有的值都是:“System.Web.Mvc.SelectListItem”。 – user441521

+0

这工作!我想在这一点上,然后我可以从模型中返回实际的列表类型,而不是将其转换为SelectList(),并且在视图中我会放置实际模型的id/value列。谢谢您的帮助! – user441521

+0

你最近的编辑将不起作用,因为我可以有多个记录需要显示这个(我正在循环播放我的item.RecordType模型,因此在视图内部执行它是必需的,并且像您在第一个示例中那样工作。 – user441521

1

当你组装您RecordTypesSelectListItem收集,请务必将Selected = true当前所选item--它不会将它给你的。

假设你的视图模型配合的RecordType可变起来反对你的数据集的RECORD_TYPE_ID变量,您可以更新变量的创建到:

from r in recordTypes 
select new SelectListItem { Text = r.RECORD_TYPE, Value = r.RECORD_TYPE_ID.ToString(), Selected = r.RECORD_TYPE_ID == this.RecordType } 

如果您要重新使用在多个下拉列表中选择RecordTypes变量在视图上,你将不得不改变你的方法,并为每个下拉菜单创建IEnumerable<SelectListItem>。 Suchas:

@Html.DropDownListFor(modelItem => item.RecordType, RecordTypes.Select(rt => new SelectListItem { Text = rt.Text, Value = rt.Value, Selected = rt.Value == item.RecordType})) 
+0

该集合没有为每个记录组装。它被组装一次并传递到视图。我可以有x个记录显示这个下拉框,并且它们都有不同的值,因此在RecordTypes程序集中设置它看起来不会有效。 – user441521