2017-11-30 12 views
0

私はasp.net mvcプロジェクトで作業しています。asp.net mvc selectlist "{}"が結果に表示されます

テーブルの2つのフィールドをドロップダウンリストに組み合わせることができました。しかし、作成ビューとインデックスビューの両方で、これらの「{}」の括弧が得られ、それらを取り除く方法を理解できません。

コントローラー: //取得:作成/

var units = db.EquipmentLists 
      .Where(s => s.Unit != null) 
      .OrderBy(s => s.Unit) 
      .Select(s => new 
      { 
       Description = s.Unit + " - " + s.MakeModel 
      }).ToList(); 

     ViewBag.Units = new SelectList(units); 

//ポスト:/

ViewBag.Units = new SelectList(db.EquipmentLists.OrderBy(x => x.Unit + " - " + x.MakeModel)); 

を作成Create.cshtml

@Html.DropDownListFor(model => model.Unit, (SelectList)ViewBag.Units, "Select one...", htmlAttributes: new { @class = "form-control" }) 

私は「なぜ知ってはいけませんビュー内で角括弧"{ }"が表示されます。ちょうどそれらを取り除きたい。どんな助けもありがとう。

答えて

0

クエリでは、Descriptionという名前の匿名オブジェクトが作成されています。

あなたは単一の引数(パラメータがIEnumerableです)メソッドは、各オプションの値と表示テキストを生成するために、コレクション内の各アイテムで.ToString()を呼び出す)とSelectListコンストラクタを使用して、どこコレクションのみ適しています単純型(例えばIEnumerable<string>またはIEnumerable<int>

変更dataValueField,dataTextField

ViewBag.Units = new SelectList(units, "Description", "Description"); 
の引数を受け入れ overloadを使用して値と表示テキストのためのあなたの頂けるご希望のおオブジェクトのプロパティを指定するには、コンストラクタに含まれてい

別の方法としては、直接

ViewBag.Units = db.EquipmentLists 
    .Where(s => s.Unit != null) 
    .OrderBy(s => s.Unit) 
    .Select(s => new SelectListItem 
    { 
     Value = s.Unit + " - " + s.MakeModel, 
     Text = s.Unit + " - " + s.MakeModel, 
    }); 

を使用してIEnumerable<SelectListItem>を作成し、ステファンは正しいですが、私は少し詳細にそれを説明しましょうと何

@Html.DropDownListFor(m => m.Unit, (IEnumerable<SelectListItem>)ViewBag.Units, "Select one...", new { @class = "form-control" }) 
+0

selectlistの引数の説明をありがとう。本当に家にぶつかる。 MVCの初心者です。コンストラクタの作成時にVSが吐き出されるヒントを理解することは難しいです。 – user2673097

+0

また、ビューモデルを使用して、 'ViewBag'([MVCのViewModelとは何ですか?]の使用を取り除くことをお勧めします(https://stackoverflow.com/questions/11064316/what-is-viewmodel-inあなたのビューモデルにはIEnumerable Units'というプロパティが含まれています - [this Q/A](https://stackoverflow.com/questions/34366305/the-viewdata-item-mvc)のコードを参照してください)典型的な例では、キータイプxxx-of-of-type-system-int32-but-must-be-o) –

0

にビューを調整することができます。

ViewBag.[VAR] = new SelectList([list], [value], [text]); 

は、限り、あなたはIEnumerableを継承するコレクションを持っているようhere

SelectList(IEnumerable items, string dataValueField, string dataTextField); 

を詳細にSelectListコンストラクタを使用して、それが選択リストで動作します。 dataValueFieldは、valueというhtmlのプロパティには、dataTextFieldに表示する内容を示します。

これは、フィールドをテキストとして連結することができるので、データテーブルオブジェクトで使用すると便利です。例:

public class Obj1 
{ 
    public int id {get; set} 
    public string field1 {get; set;} 
    public string field2 {get; set;} 
    public string DisplayField {get {return field1 + " " + field2;}} 
} 
//In your controller 
public ActionResult Create() 
{ 
    ...other code 
    List<Obj1> list = GetAllObj1(); //however you get the fields 
    ViewBag.Fields = new SelectList(list, "id", "DisplayField"); 
    return View(); 
} ... 

これは一部に役立ちます。

0

コントローラー側で次のコードを使用してください ViewBag.Units = db.EquipmentLists.Select(s => new SelectListItem {Value = s.Unit + " - " + s.MakeModel、Text = s.Unit + " - "+ s。MakeModel});

と表示側の下に使用 @ Html.DropDownListFor(m => m.Unit、(IEnumerable)ViewBag.Units、 "Select one ..."、新しい{@class = "form-control"}) )