如何生成一个选择列表,其中文本字段由两个或多个文本列组成,例如:我在数据库中有一个描述和速率字段,我想将这些组合显示:
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>
...但是“描述”+“ - £”+“费率”);不会运行:
数据绑定: 'System.Data.Entity.DynamicProxies.Stand_63F8C9F623B3C0E57D3008A57081AFCD9C39E1A6B79B0380B60840F1EFAE9DB4' 不包含名称为“Description--£Rate”的属性。
感谢您的帮助,
标记
答案 0 :(得分:74)
您可以使用简单的LINQ投影创建一个新的匿名类,然后使用SelectList(IEnumerable, string, string)
constructor overload指定要用于<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 interpolation比string.Format
...
Description = $"{s.Description}-- £{s.Rate}"
如果你投射到一个强大的ViewModel
类名(而不是一个匿名类),你无疑会想要用nameof
运算符的安全性替换魔术字符串:
ViewBag.StandID = new SelectList(stands, nameof(Stand.StandID), nameof(Stand.Description));
答案 1 :(得分:14)
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");
答案 2 :(得分:5)
您可以创建部分Model类
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");
答案 3 :(得分:4)
您正在使用的构造函数的格式是 SelectList(IEnumerable items,string dataValueField,string dataTextField)。
所以当你按照你的方式使用它实际上是在告诉它绑定到名为“Description--£Rate”的TextField,如果这不是来自数据库的字段被调用的那么它就不会知道你在说什么。
只要dataValueField中的值与您放入Value的属性的名称匹配,上述两种方法中的任何一种都可以工作,而dataTextField与您放置Text的属性名称相匹配,也许是混合以上两种解决方案。 (仅因为我更喜欢linq上的lambda表达式。)并且使用selectlist项会阻止它在转换后对集合执行ToList。实际上,您正在创建自然绑定到选择列表的对象。
您还可能需要对说明或费率进行检查,以确保在将它们放入列表之前它们不是空的
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");
答案 4 :(得分:1)
我是通过修改我的视图模型来完成的,这是我的代码:
视图模型
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using MvcEsosNew.Models;
using System.Web.Mvc;
namespace MvcEsosNew.ViewModels
{
public class EntitlementViewModel
{
public int EntitlementCount { get; set; }
public Entitlement Entitlement { get; set; }
public SelectList Member { get; set; }
public SelectList Job_Grade { get; set; }
public SelectList Department { get; set; }
public SelectList Esos_Batch { get; set; }
}
public class department_FullName
{
public int deptID { get; set; }
public string deptCode { get; set; }
public string deptName { get; set; }
public string fullName { get { return deptCode + " - " + deptName; } }
}
}
控制器
public void getAllDepartment(EntitlementViewModel entitlementVM)
{
var department = from Department in db.Departments.Where(D => D.Status == "ACTIVE").ToList()
select new department_FullName
{
deptID = Department.id,
deptCode = Department.department_code,
deptName = Department.department_name
};
entitlementVM.Department = new SelectList(department, "deptID", "fullName");
}
视图
<div class="form-group row">
<div class="col-sm-2">
@Html.LabelFor(model => model.Entitlement.department_id)
</div>
<div class="col-sm-10">
@Html.DropDownListFor(model => model.Entitlement.department_id, Model.Department, new { @class="form-control" })
@Html.ValidationMessageFor(model => model.Entitlement.department_id)
</div>
</div>
结果: