Результат запроса LINQ в MVC SelectList как значение и текст-не работает
Я пытаюсь использовать результат запроса LINQ для заполнения списка выбора в приложении MVC 5. Запрос LINQ возвращает идентификаторы клиентов.
модель
public partial class Pricelist
{
    public int CustomerID { get; set; }
    public int SelectedCustomer { get; set; }
    public Pricelist(int customerID, int selectedCustomer)
    {
    }
}
посмотреть
@Html.DropDownList("custList")
            6 ответов
Я думаю, что не так приятно использовать ViewBag для заполнения раскрывающихся списков в mvc. Вы должны изменить модель, чтобы иметь список SelectedListItem и заполнить его из списка прайс-листа, чтобы он выглядел так:
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); 
самый простой способ-позволить бритве беспокоиться о 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 как можно больше.
вы можете изменить свой раскрывающийся список в своем представлении
@Html.DropDownList("custList", new SelectList(ViewBag.custList, "Id" , "Name"))
и ваш ViewBag в контроллере (1) Как
ViewBag.custList = CustomerList;
в объекте 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;
Спасибо за все ваши ответы, я понимаю больше о том, как работает 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--")