我正在尝试使用LINQ查询的结果来填充MVC 5应用程序中的SelectList。 LINQ查询返回客户ID。
模型
public partial class Pricelist
{
public int CustomerID { get; set; }
public int SelectedCustomer { get; set; }
public Pricelist(int customerID, int selectedCustomer)
{
}
}
查看
@Html.DropDownList("custList")
控制器(1)
var query = ((from s in db.Pricelists
select s.CustId).Distinct()).ToList();
int i = 1;
List<Pricelist> CustomerList = new List<Pricelist>();
foreach (var c in query)
{
int cust = c;
Pricelist p = new Pricelist(i, cust);
CustomerList.Add(p);
i++;
}
SelectList custList = new SelectList(CustomerList);
ViewBag.custList = custList;
return View();
返回使用Model类名填充的下拉列表 (如果我试图在foreach中返回i和cust .ToString(),我会得到一个例外。) 我试过这个,因为下面的Controller方法产生了不同的CustomerID列表,但是当它被POST时返回NULL(我想因为SelectList中没有指定Value)
public ActionResult Create()
{
var query = (from s in db.Pricelists
select s.CustId).Distinct();
SelectList CustomerList = new SelectList(query);
ViewBag.custList = CustomerList;
return View();
}
指向我出错的地方,以及如何继续欣赏。
答案 0 :(得分:8)
最简单的方法是让Razor担心SelectList
并只需要IEnumerable<SelectListItem>
。
ViewBag.custList = CustomerList.Select(m => new SelectListItem { Value = m.Id, Text = m.Name });
然后在你看来:
@Html.DropDownListFor(m => m.SomeField, (IEnumerable<SelectListItem>)ViewBag.custList)
您可以使用可以强类型而非ViewBag
的视图模型来实现更好的效果。你应该尽可能地避免ViewBag
。
答案 1 :(得分:7)
我认为使用ViewBag填充mvc中的下拉列表并不是那么好。 你应该改变模型以获得SelectedListItem列表并从PriceList列表中填充它,所以它应该如下所示:
public class Model
{
public int CustomerID { get; set; }
public int SelectedCustomer { get; set; }
public IList<Pricelist> PriceList{get;set;}
public IList<SelectListItem> PriceListSelectListItem{get;set;}
{
get
{
var list = (from item in PriceList
select new SelectListItem()
{
Text = item.customerID.ToString(CultureInfo.InvariantCulture),
Value = item.selectedCustomer.ToString(CultureInfo.InvariantCulture)
}).ToList();
return list;
}
set{}
}
}
现在您可以执行以下操作:
@Html.DropDownListFor(c=>c.CustomerID,Model.PriceList)
尝试使用这样的下拉列表,这看起来比在视图中使用ViewBag更专业。
控制器:
var query = ((from s in db.Pricelists
select s.CustId).Distinct()).ToList();
int i = 1;
List<Pricelist> CustomerList = new List<Pricelist>();
foreach (var c in query)
{
int cust = c;
Pricelist p = new Pricelist(i, cust);
CustomerList.Add(p);
i++;
}
model.PriceList=result of your query
return View("ViewName",model);
答案 2 :(得分:1)
您可以在视图中更改下拉列表
@Html.DropDownList("custList", new SelectList(ViewBag.custList, "Id" , "Name"))
您在Controller(1)中的ViewBag为
ViewBag.custList = CustomerList;
答案 3 :(得分:0)
在您的CustomerList对象上,设置DataTextField和DataValueField属性。
这样的事情:
SelectList CustomerList = new SelectList(query);
CustomerList.DataTextField = "Name"; // Name property of customer object
CustomerList.DataValueField = "Id"; // id property of customer object
ViewBag.custList = CustomerList;
答案 4 :(得分:0)
我认为这可能有所帮助:
@Html.DropDownList("custList", (SelectList) ViewBag.custList)
答案 5 :(得分:0)
感谢您的所有答案,我更了解SelectList如何运作,但没有足够的技巧来使所有这些答案都有效。这最终奏效了:
控制器:
public ActionResult Create()
{
var query = (from s in db.Pricelists
select s.CustId).Distinct();
SelectList custList = new SelectList(query);
ViewBag.custList = custList;
return View();
}
查看:
@Html.DropDownListFor(model => model.CustId , (SelectList)ViewBag.custList, "--Select--")