LINQクエリの結果を使用して、MVC5アプリケーションの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();
これは、モデルクラス名が入力されたドロップダウンを返します(foreachでiとcust .ToString()を返そうとすると例外が発生します)。以下のControllerメソッドが個別のCustomerIDのリストを生成したため、これを試しましたが、 POSTされたときはNULL(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();
}
私が間違っているところへのポインタ、そしてどのように進めるかは非常に高く評価されています。
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);
最も簡単な方法は、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
はできるだけ避けてください。
ビューでドロップダウンリストを変更できます
@Html.DropDownList("custList", new SelectList(ViewBag.custList, "Id" , "Name"))
そして、コントローラー(1)のViewBagは
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--")
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)