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