2011-07-10 3 views
3
私はからリストを使用してDDLを移入する正しい方法は何か...キャストが間違っているというエラーを取得 DropDownListのためにそれを使用しようとすると、私のモデルは、この

のDropDownList

public IEnumerable<SelectListItem> ProductTypes { get; set; } 

    public ProductContent() 
    { 
     productxEntities db = new productxEntities(); 

     ProductTypes = db.ProductCodes.Select(c => new SelectListItem 
     { 
      Value = c.product_type.ToString(), 
      Text = c.code.ToString() 
     }); 



    } 

のように見えます

MVC3 Razor C#のDB、私はこのモデルタイプの密接に結合されたビューを持っています。

@Html.DropDownList("ProductTypes", (IEnumerable<SelectListItem>) Model.ProductTypes) 

このタイプのオブジェクトをキャストすることができないエラー

'System.Data.Entity.Infrastructure.DbQuery 1[System.Web.WebPages.Html.SelectListItem]' to type 'System.Collections.Generic.IEnumerable 1 [System.Web.Mvc.SelectListItem]' です。

これは、あなたのEFクエリでToListどこかを呼び出すべきである私のコントローラ

public ActionResult Create() 
    { 
     ProductContent productViewModel = new ProductContent(); 
     return PartialView("../PartialViews/NewProduct", productViewModel); 
    } 
+0

**どのようなエラーが発生しますか?**エラーの_exact_テキストは何ですか? – SLaks

+1

そのロジックをモデルに組み込むことは良い考えではありません。それは他の場所にあるはずです。また、アクションがモデルを返す方法を確認するためにコントローラのコードを投稿する必要があります。 – vcsjones

+0

エラーを投稿するときにエラーが見つかりましたが、System.Web.Mvcをselecte itemlistに使用していないためにエラーが発生しましたが、新しいエラーが発生しました。エンティティへのLINQは、 'System.String ToString()'メソッドを認識しません。このメソッドをストア式に変換することはできません。 –

答えて

10

です。それ以外の場合は、Queryableをビューに直接返します。おそらくこのような

public ProductContent() 
{ 
    productxEntities db = new productxEntities(); 

    ProductTypes = db.ProductCodes.ToList().Select(c => new SelectListItem 
    { 
     Value = c.product_type.ToString(), 
     Text = c.code.ToString() 
    }); 
} 

私も私のコメントで述べたように、私はモデルのコンストラクタでこの種のコードを思いとどまらせるでしょう。他の人がそれをモデルに割り当てる必要があります。

あなたのビューでキャストを削除することができます。

+0

この新しいエラーが発生しました LINQ to Entitiesは、 'System.String ToString()'メソッドを認識せず、このメソッドをストア式に変換することはできません。 –

+3

マイナー: '選択 'の後に' ToList() 'が必要な場合や、必要な2つの列の代わりにテーブル全体を引っ張ってくるでしょう。 – user122211

+0

あなたは( ProductTypes = db.ProductCodes.ToList()。選択します(C =>新しいSelectListItem { 値= c.product_type.ToString()、 テキスト= c.code.ToString() })。ToListメソッドを意味します); –

3

System.Web.WebPages.Html.SelectListItemSystem.Web.Mvc.SelectListItemのタイプは割り当て不可能です。

コントローラには、ビューに異なる名前空間のインポートがある可能性があります。この場合、明示的に指定する必要があります。モデルにnew System.Web.Mvc.SelectListItem(...)を使用するか、ビューを(IEnumerable<System.Web.WebPages.Html.SelectListItem>)にキャストする必要があります。

+0

これはどのようにrelaventが完全にわかりません。この問題はIQueryableを返そうとしていましたが、DB接続は列挙しようとすると閉じられる可能性があります。それは有効なキャストではありませんでした。 – vcsjones

+1

@vcsjones質問のエラーは無効なキャストであり、IQueryableではありません。それが私の対処です。 IQueryableに関するあなたのアドバイスは、痛み(接続が閉じられていること、複数のクエリが実行されていることなど)の可能性がある点を指摘していたので、有用で正確でした。 –