我有一个MVC 5 .net应用程序,使用Razor视图引擎。我试图从实体框架模型填充下拉列表。这是我在控制器中的linq语句:
private void populateDistrictTypeDropDown(object selectedDistrict = null){
var query = from d in db.roadways
orderby d.district
select d;
ViewBag.District = new SelectList(query, "district", "District", selectedDistrict).Distinct();
}
但似乎没有订购或只抓取不同的物品,它应该是我看起来的样子。
这是它的样子:
以下是我的观点:
@Html.DropDownListFor(xy => xy.SelectedDistrictTypeIds, new SelectList(Model.DistrictTypesList, "Id", "district"))
以下是模型:
public class SearchPageModel
{
public IEnumerable<lkp_roadwaytypes> FacilityTypes { get; set; } // use this to get roadway type, which = FacilityTypes
public IEnumerable<survey> Surveys { get; set; } // use this to get period to search for from surveydate
public IEnumerable<roadway> Roadways { get; set; }// use this to get Disctricts and Cost Centers
// below is for drop down select list on search page
public int[] SelectedDistrictTypeIds { get; set; }
public List<roadway> DistrictTypesList { get; set; }
public int[] SelectedPeriodIds { get; set; }
public List<survey> PeriodList { get; set; }
public MainContext myContext = new MainContext();
public List<roadway>GetDistrictTypes(){
return myContext.roadways.Where(a=>a.district != null).ToList();
}
}
为萨米的回答编辑:
使用Equals方法创建了一个新类 -
class District
{
public int ID {get; set;}
public int Name { get; set; }
public bool Equals(District d1, District d2)
{
if(d1.ID == d2.ID){return true;}
else{return false;}
}
}
将查询更改为 -
private void populateDistrictTypeDropDown(object selectedDistrict = null){
var query = (from d in db.roadways
orderby d.district
select new District {ID = d.ID, Name = d.district}).Distinct();
ViewBag.District = new SelectList(query, "ID", "Name", selectedDistrict);
}
但是我得到了相同的结果,所以我必须遗漏你说过的话。我应该以某种方式调用equals方法,还是.Distinct()为我做这个?
编辑2:
我注意到我没有在视图中使用ViewBag,因此我将其更改为:
@Html.DropDownListFor(vx => vx.SelectedDistrictTypeIds, new SelectList(ViewBag.District))
但现在我的方框看起来像这样:
答案 0 :(得分:1)
不要区分SelectList,而是区分查询:
var query = (from d in db.roadways
orderby d.district
select d.district)
.Distinct;
此外,根据Sami,您需要在区域订购和区分,而不是道路(参见更改的选择线)
答案 1 :(得分:0)
您目前正在使用LINQ选择roadway
类型的对象。如果你试图区分它们,你将总是得到所有对象,因为它们是不同的,除非你已经定义了相等比较函数。
我想你不想总是按地区ID比较roadway
s,所以我建议你创建一个新的类来存储地区名称和ID,从中返回那种类型的对象您的查询,为它定义比较操作,然后您可以区分它。
所以你的查询就像
var query = (from d in db.roadways
orderby d.district
select new District { ID = d.Id, Name = d.district }).Distinct();
然后,如果您已经定义了Equals方法,那么您的列表应该根据您在那里定义的任何内容进行区分(可能是Id的比较?)
您还必须绑定SelectList以使用District类中的新属性,而不是roadway类。
答案 2 :(得分:0)
好的,不确定这是否是最好的方法,但它对我有用:
把它放在我的模型中:
// populate district drop down
public IEnumerable<int> populateDistrictTypeDropDown(){
var query = (from d in myContext.roadways
orderby d.district
select d.district).ToList().Distinct();
return query;
}
这是我的控制者:
public ActionResult Search()
{
SearchPageModel spm = new SearchPageModel();
spm.DistrictTypesList = spm.populateDistrictTypeDropDown();
return View(spm);
}
这是我的观点:
@Html.DropDownListFor(xy => xy.SelectedDistrictTypeIds, new SelectList(Model.DistrictTypesList))