Результат запроса 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;

Я думаю, это может помочь:

@Html.DropDownList("custList", (SelectList) ViewBag.custList)

Спасибо за все ваши ответы, я понимаю больше о том, как работает 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--")