MVC SelectList中的LINQ查询结果为值和文本 - 不起作用

时间:2014-02-21 15:56:38

标签: c# asp.net-mvc linq asp.net-mvc-5 selectlist

我正在尝试使用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();
}

指向我出错的地方,以及如何继续欣赏。

6 个答案:

答案 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--")