web-dev-qa-db-ja.com

値およびテキストとしてのMVCSelectListでのLINQクエリの結果-機能しない

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

私が間違っているところへのポインタ、そしてどのように進めるかは非常に高く評価されています。

6

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

最も簡単な方法は、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はできるだけ避けてください。

8
Chris Pratt

ビューでドロップダウンリストを変更できます

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

そして、コントローラー(1)のViewBagは

ViewBag.custList = CustomerList;
1
drunkcoder

すべての回答に感謝します。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--")
0

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;
0
milagvoniduak

私はこれが役立つと思います:

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