Ste*_*ski 6 c# linq asp.net-mvc selectlist asp.net-mvc-5
我试图使用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)
{
}
}
Run Code Online (Sandbox Code Playgroud)
视图
@Html.DropDownList("custList")
Run Code Online (Sandbox Code Playgroud)
控制器(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();
Run Code Online (Sandbox Code Playgroud)
返回一个填充了Model类名称的下拉列表(如果我尝试在foreach中返回i和cust .ToString(),我会得到一个异常.)我试过这个,因为下面的Controller方法产生了不同的CustomerID列表,但是返回了它被POST时为NULL(我认为因为在SelectList中没有指定值)
public ActionResult Create()
{
var query = (from s in db.Pricelists
select s.CustId).Distinct();
SelectList CustomerList = new SelectList(query);
ViewBag.custList = CustomerList;
return View();
}
Run Code Online (Sandbox Code Playgroud)
指向我出错的地方,以及如何继续前行.
最简单的方法是让Razor担心SelectList并且只是喂它IEnumerable<SelectListItem>.
ViewBag.custList = CustomerList.Select(m => new SelectListItem { Value = m.Id, Text = m.Name });
Run Code Online (Sandbox Code Playgroud)
然后在你看来:
@Html.DropDownListFor(m => m.SomeField, (IEnumerable<SelectListItem>)ViewBag.custList)
Run Code Online (Sandbox Code Playgroud)
您可以使用可以强类型而不是类型的视图模型来实现更好的效果ViewBag.你应该ViewBag尽可能地避免.
我认为使用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{}
}
}
Run Code Online (Sandbox Code Playgroud)
现在你可以做这样的事情了:
@Html.DropDownListFor(c=>c.CustomerID,Model.PriceList)
Run Code Online (Sandbox Code Playgroud)
尝试使用这样的下拉列表,这看起来比在视图中使用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);
Run Code Online (Sandbox Code Playgroud)