asp.net mvc razor从twotables填充@ Html.DropDownList

时间:2016-02-02 15:35:07

标签: asp.net-mvc razor html-select

使用下面的代码我得到了这个:

<select id="ClarderSousSecteurID" name="ClarderSousSecteurID">
    <option value="">---  Tous  ---</option>
    <option value="23">23</option>
    <option value="46">46</option>
    <option value="29">29</option>
        ....
</select>

我错过了这个:

<select id="ClarderSousSecteurID" name="ClarderSousSecteurID">
    <option value="">---  Tous  ---</option>
    <option value="23">Libelle No 1</option>
    <option value="46">Libelle No 2</option>
    <option value="29">Libelle No 3</option>
        ....
</select>

查看:

Sous-secteur Clarder : @Html.DropDownList("ClarderSousSecteurID", "---  Tous  ---")

Controler:

var data = from p in db.tblUSUAs
                       join f in db.tblClarderSousSecteur
                       on p.ClarderSousSecteurID equals f.ClarderSousSecteurID
                       select new
                       {
                           ClarderSousSecteurID = p.ClarderSousSecteurID,
                           ClarderSousSecteurLibelle = f.ClarderSousSecteurLibelle
                       };
            ViewBag.ClarderSousSecteurID = new SelectList(data.Select(a => a.ClarderSousSecteurID).Distinct().Select(c => new { ClarderSousSecteurID = c, ClarderSousSecteurLibelle = c }), "ClarderSousSecteurID", "ClarderSousSecteurLibelle", ClarderSousSecteurID);

非常感谢你。 Nacer T。

1 个答案:

答案 0 :(得分:0)

查看您传递给SelectList构造函数的数据。

 data.Select(a => a.ClarderSousSecteurID)
      .Distinct()
      .Select(c => new { ClarderSousSecteurID = c, ClarderSousSecteurLibelle = c })

您只选择ClarderSousSecteurID中的data项。所以表达式data.Select(a => a.ClarderSousSecteurID)将为您提供一个Integers的集合(IQueryable of int),并且您在SelectClarderSousSecteurID值的后期ClarderSousSecteurLibelle中使用该结果。这就是您获得选项文本和值的ClarderSousSecteurID值的原因。

如果您的加入为您提供了独特的结果,则根本不需要进行“区别”通话。您可以将结果转换为SelectListItem列表

var data = (from p in db.tblUSUAs
           join f in db.tblClarderSousSecteur
           on p.ClarderSousSecteurID equals f.ClarderSousSecteurID
           select new SelectListItem
           {
              Value = p.ClarderSousSecteurID.ToString(),
              Text = f.ClarderSousSecteurLibelle
           }).ToList();
ViewBag.ClarderSousSecteurID = new SelectList(data, "Value","Text", ClarderSousSecteurID);

但是,如果您的LINQ联接为您提供了非唯一的记录,并且您仍希望基于ClarderSousSecteurID列值执行不同的操作,则可以在ClarderSousSecteurID属性上执行分组并将结果转换为SelectListItem的集合。

List<SelectListItem> uniqueListById = data.GroupBy(s => s.ClarderSousSecteurID,
                   p => p,
                  (k, v) => new SelectListItem { 
                                    Value = k.ToString(), 
                                    Text = v.FirstOrDefault().ClarderSousSecteurLibelle })
                                                                                 .ToList();

您可以根据需要将此数据用于下拉列表。

ViewBag.ClarderSousSecteurID = new SelectList(uniqueListById, "Value","Text",
                                                                    ClarderSousSecteurID);