2016-07-29 9 views
0

In MVC.Kann SelectList-Werte von Lambda in Razor nicht anzeigen

Ich bekomme diese Fehlermeldung beim Versuch, eine DropDownList in Razor anzuzeigen.

DataBinding: 'System.Int32' enthält keine Eigenschaft mit dem Namen 'BranchId'.

Im Ãœberwachungsfenster ich in der Lage bin 1 Datensatz zu sehen, wird von der Datenbank zurückgegeben ein BranchId und BranchName Ich habe keinen Hinweis auf die SelectList in der Modellklasse enthält.

In der Controller-Klasse

var list = new SelectList(db.Branchs.Where(branches => !db.CompanyBranches 
    .Any(d => d.BranchId == branches.BranchId)) 
    .Select(branches => branches.BranchId).ToList(), 
    "BranchId", "BranchNumber"); 
ViewBag.Branch = new SelectList(list); 

Im Create.cshtml

@Html.DropDownList("Branch", new SelectList(ViewBag.Branch, "BranchID", "BranchName"), htmlAttributes: new { @class = "form-control" }) 

Dank Stephen

ich den Lambda-Ausdruck in meinem CompanyBranchesController geändert, wie Sie vorgeschlagen ist es jetzt var list = db.Branchs.Where (Zweige =>! Db.C ompanyBranches .Any (d => d.BranchId == branches.BranchId)) .Wählen Sie (b => new {BranchId = b.BranchId, BranchName = b.BranchName}). ToList();

Die Create.cshtml für das Dropdown ist @ Html.DropDownList ("Verzweigung", wie ViewBag.Branch IEnumerable, Htmlattributes: new {@class = "form-control"})

das Ergebnis in der Dropdownlist ist {BranchId = 5, BranchNumber = Br0003}

ich habe mit ihm spielen, einschließlich Ergänzung der CompanyBranchController Listenelemente = new List(); foreach (var i in Liste) { SelectListItem s = neu SelectListItem(); am Text = i.BranchName.ToString(); s.Value = i.BranchId.ToString(); Artikel.Add (s);
}

Sowie verschiedene Rasierer Ausdrücke, aber ohne Erfolg zu versuchen.

Irgendeine Idee, wo ich falsch liege?

Antwort

1

Blick auf diesen Teil des Codes (Der Select Konstruktor)

Select(branches => branches.BranchId).ToList() 

Sie sind die branchId der Auswahl. Sie übergeben also eine Liste von Ganzzahlen an den SelectList-Konstruktor. Sie geben jedoch an, dass BranchId das Datenwertfeld ist. Aber die ganze Zahl hat keine solche Eigenschaft.

So sollten Sie Ihre Auswahl auf einen annonymous Typ verändern, die diese Eigenschaften hat

Select(b => new { BranchId = b.BranchId, BranchNumber = b.BranchId).ToList() 

Auch Sie müssen nicht noch einmal eine andere Select erstellen, wenn Sie mit dem ViewBag zuweisen. Das ist also gut genug

ViewBag.Branch = list; 

und Ihrer Ansicht

@Html.DropDownList("Branch", ViewBag.Branch as IEnumerable<SelectListItem>, 
             htmlAttributes: new { @class = "form-control" }) 

Oder noch einfacher Sie einfach Ihre Artikel auf eine Liste von SelectListItem

var list= db.Branchs.Where(// Put your where clause here) 
      .Select(branches => new SelectListItem { Value = branches.BranchId.ToString(), 
             Text = branches.BranchId.ToString()}).ToList(); 
ViewBag.Branch = list; 
umwandeln
+0

Vielen Dank für Ihre Antwort Stephen – Paul

0

Ihr Code war richtig, außer dass in der CompanyBranchContoller ich

hinzugefügt habe

Listenelemente = neue Liste(); foreach (var i in Liste) { SelectListItem s = neu SelectListItem(); am Text = i.BranchName.ToString(); s.Value = i.BranchId.ToString(); Artikel.Add (s);
}

ViewBag.Branch = Elemente;

Dann in der Create.cshtml Klasse wechselte ich den Verweis auf die Dropdown-Liste, was Sie vorgeschlagen @ Html.DropDownList ("Filiale", ViewBag.Branch als IEnumerable, Htmlattributes: neue {@ Klasse = „form-control } ")

Vielen Dank für Ihre Hilfe Stephen

Paul

Verwandte Themen