2017-02-02 2 views
1

Ich mache das ASP.NET-Webanwendungs-Tutorial als Teil eines Projekts, und ich bekomme eine Fehlermeldung als Titel von diesem PostEs gibt kein ViewData-Element vom Typ 'IEnumerable <SelectListItem>' mit dem Schlüssel 'SelectedDepartment'

ich versuche, eine Dropdown-Menü in den Kursen Seite zu zeigen, eine Abteilung für den Kurs ausgewählt auszuwählen. enter image description here

Es funktioniert gut, bevor ich mit GenericRepository und UnitofWork Klassen zu arbeiten begann. Ich muss diesen Code kommentieren Sie unten in meinem Views/Kurs/Index.cshtml, um die Kurse Seite selbst zu arbeiten.

@using (Html.BeginForm()) 
{ 

    @*<p> 
     Select Department: @Html.DropDownList("SelectedDepartment", "All") 
     <input type="submit" value="Filter" /> 
    </p>*@ 
} 

Momentan habe ich einen ViewResult Index Code wie im Tutorial.

public ViewResult Index() 
{ 
    var courses = unitOfWork.CourseRepository.Get(includeProperties: "Department"); 
    return View(courses.ToList()); 
} 

Und ich hatte dieses Action Index-Methode, bevor Sie die Repositorys

public ActionResult Index(int? SelectedDepartment) 
{ 
    var departments = db.Departments.OrderBy(q => q.Name).ToList(); 
    ViewBag.SelectedDepartment = new SelectList(departments, "DepartmentID", "Name", SelectedDepartment); 
    int departmentID = SelectedDepartment.GetValueOrDefault(); 

    IQueryable<Course> courses = db.Courses 
     .Where(c => !SelectedDepartment.HasValue || c.DepartmentID == departmentID) 
     .OrderBy(d => d.CourseID) 
     .Include(d => d.Department); 
    //var sql = courses.ToString(); 
    return View(courses.ToList()); 
} 

In meinem CourseController tun ich eine PopulateDepartmentsDropDownList Methode haben, die sich ändern erforderlich sein kann, aber ich habe mit ihm gespielt, um, aber bisher kein Erfolg.

private void PopulateDepartmentsDropDownList(object selectedDepartment = null) 
{ 
    var departmentsQuery = unitOfWork.DepartmentRepository.Get(orderBy: q => q.OrderBy(d => d.Name)); 

    ViewBag.DepartmentID = new SelectList(departmentsQuery, "DepartmentID", "Name", selectedDepartment); 
} 

Alle Tipps zur Behebung dieses Problems bitte.

+0

Können Sie Ihre Aktionsmethode für diese Ansicht veröffentlichen? Das 'Index ActionResult' speziell –

+0

Ich habe ein ViewResult für die Index-Methode anstelle von ActionResult. – Truecolor

+0

Also in der ViewResult ist, wo Sie die 'ViewBag.DepartmentID' deklarieren –

Antwort

0

ich die Filter nur musste meine Get-Methode (die Index-Methode) im Controller bearbeiten aufzunehmen.

bool hasValue = SelectedDepartment.HasValue; 
var courses = courseService.ListCourses(hasValue,departmentID); 
1

Sie geben den Namen der DropDown-Liste als SelectedDepartment an, aber in der Aktion haben Sie ViewBag.DepartmentID, die das Objekt SelectList enthält. Sie verwenden nicht die bevölkerten SelectList in View, also was passiert ist, dass DropDownList in ViewBag für Schlüssel SelectedDepartment für die Elemente für DropDown-Liste sucht, die ausgefüllt werden wird, die die Standardbehauptung der DropDownList-Helper-Methode ist.

Sie müssen die ViewBag.DepartmentID in Ihrem Dropdown Helfer verwenden wie:

@Html.DropDownList("selectedDepartment","All",ViewBag.DepartmentID as SelectList) 
+0

Es hat diese rote Fehlerzeile unter' "All" 'Sprichwort" kann nicht von 'String' zu 'Systems.Collections.Generic.IEnumerable ‘'

Wählen Sie Abteilung: @ Html.DropDownList ("SelectedDepartment", "Alle", ViewBag.DepartmentID als Select)

' – Truecolor

+0

Der C# -Code, den das OP zur Verfügung stellt, ist nicht seine Aktion .. nur eine Methode zum Auffüllen der Dropdown-Liste. –

+0

Auch gibt es keine überladene Methode für 'Html.DropDownList', die 2 Strings enthalten kann, und dann eine selectlist .. die selectlist sollte vor "All" platziert werden –

Verwandte Themen