MVC SelectList在文本字段中组合多个列

我如何生成一个select列表,其中的文本字段,由两个或两个以上的文本列组成,例如:我的数据库中有一个描述和比率字段,我想结合这些显示:

Large--£200 Medium--£150 Small--£100 

控制器代码是:

  var stands = db.Stands.Where(s => s.ExhibitorID == null).ToList(); ViewBag.StandID = new SelectList(stands,"StandID", "Description" + "-- £" + "Rate"); 

…我的观点是(目前):

  <div class="editor-field"> @Html.DropDownList("StandID", "--Select--") </div> 

…但是“描述”+“ – £”+“比率”); 将不会运行:

DataBinding:'System.Data.Entity.DynamicProxies.Stand_63F8C9F623B3C0E57D3008A57081AFCD9C39E1A6B79B0380B60840F1EFAE9DB4'不包含名称为'Description – £Rate'的属性。

谢谢你的帮助,

标记

您可以使用简单的LINQ投影创build一个新的匿名类,然后使用SelectList(IEnumerable, string, string) 构造函数重载指定要用于<option>元素的值和文本字段,即:

 var stands = db.Stands .Where(s => s.ExhibitorID == null) .Select(s => new { StandID = s.StandID, Description = string.Format("{0}-- £{1}", s.Description, s.Rate) }) .ToList(); ViewBag.StandID = new SelectList(stands, "StandID", "Description") 

编辑

在C#6及更高版本中, string插值可以比string.Format更好地进行读取

  ... Description = $"{s.Description}-- £{s.Rate}" 

如果你投影到一个强大的ViewModel类的名字(而不是一个匿名类),你无疑会想用运算符nameof的安全来replace这个魔术string:

 ViewBag.StandID = new SelectList(stands, nameof(Stand.StandID), nameof(Stand.Description)); 
 var stands = db.Stands.Where(s => s.ExhibitorID == null).ToList(); IEnumerable<SelectListItem> selectList = from s in stands select new SelectListItem { Value = s.StandID, Text = s.Description + "-- £" + s.Rate.ToString() }; ViewBag.StandID = new SelectList(selectList, "Value", "Text"); 

您可以创build一个部分模型类

 public partial class Stand { public string DisplayName { get { return this.Description + "-- £" + this.Rate.ToString(); } } } 

然后在你的观点

 var stands = db.Stands.Where(s => s.ExhibitorID == null).ToList(); ViewBag.StandID = new SelectList(stands,"StandID", "DisplayName"); 

您正在使用的构造函数的格式是SelectList(IEnumerable项,stringdataValueField,stringdataTextField)。

所以当你使用它的时候,你实际上是在告诉它绑定到名为“Description – £Rate”的TextField,如果这不是从数据库进来的字段,它将不知道你正在表明。

只要dataValueField中的值与您放置Value的属性的名称相匹配,并且dataTextField与放置Text的属性名称匹配,上述两种方法中的任何一种都可以工作,也许是两者的混合以上解决scheme (只是因为我喜欢lambdaexpression式超过linq。)和使用一个select列表项防止它必须做一个转换后的集合ToList。 你实际上正在创build自然绑定到select列表的对象。

您也可能希望在描述或比率上进行检查,以确保在将它们放入列表之前它们不是空的

 var stands = db.Stands.Where(s => s.ExhibitorID == null) .Select(s => new SelectListItem { Value = s.StandID.ToString(), Text = s.Description + "-- £" + s.Rate.ToString() }); ViewBag.StandID = new SelectList(stands, "Value", "Text");