Result of LINQ Query in MVC SelectList as Value and Text - not working

37,379

Solution 1

I thinks is not so nice to use ViewBag to populate dropdowns in mvc. You shoud change you model to have a list of SelectedListItem and populate it from list of PriceList so it should look like this :

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{}
        } 

}

and now in view you will be able to do something like this :

 @Html.DropDownListFor(c=>c.CustomerID,Model.PriceList)

Try to use dropdown like this, this will look more profesional than using ViewBag in views.

Controller:

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); 

Solution 2

The easiest method is to let Razor worry about the SelectList and just feed it an IEnumerable<SelectListItem>.

ViewBag.custList = CustomerList.Select(m => new SelectListItem { Value = m.Id, Text = m.Name });

Then in your view:

@Html.DropDownListFor(m => m.SomeField, (IEnumerable<SelectListItem>)ViewBag.custList)

You can make that nicer by using a view model that you can strongly type instead of ViewBag. You should really avoid ViewBag as much as possible.

Solution 3

You can change your dropdownlist in your view

@Html.DropDownList("custList", new SelectList(ViewBag.custList, "Id" , "Name"))

And your ViewBag in Controller (1) as

ViewBag.custList = CustomerList;
Share:
37,379
Stefan Piskorski
Author by

Stefan Piskorski

Updated on July 09, 2022

Comments

  • Stefan Piskorski
    Stefan Piskorski almost 2 years

    I am trying to use the result of a LINQ Query to populate a SelectList in a MVC 5 application. The LINQ query returns customer IDs.

    Model

    public partial class Pricelist
    {
        public int CustomerID { get; set; }
        public int SelectedCustomer { get; set; }
    
        public Pricelist(int customerID, int selectedCustomer)
        {
    
        }
    }
    

    View

    @Html.DropDownList("custList")
    

    Controller (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(); 
    

    Which returns a drop down populated with the Model class name (I get an exception if I try to return i and cust .ToString() in the foreach.) I tried this because the Controller method below produced the list of distinct CustomerIDs, but returned NULL when it was POSTed (I think because there was no Value specified in the 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();
    }
    

    Pointers to where I am going wrong, and how to proceed much appreciated.