2011-09-27 10 views
11

nie mogę dowiedzieć się, co się dzieje z tym błędem:błąd MVC - przekazany do słownika poz model jest typu „System.Collections.Generic.List`

The model item passed into the dictionary is of type 'System.Collections.Generic.List1[RepositoryExample.Employee]', but this dictionary requires a model item of type 'RepositoryExample.Models.IEmployeeManagerRepository'.`

pojawia się błąd, gdy Idę do widoku indeksu. Dodałem widok indeksu z kontrolera, ale nie ma w nim kodu. Używam Linq do SQL.

@model RepositoryExample.Models.IEmployeeManagerRepository 

@{ 
ViewBag.Title = "Index"; 
} 

<h2>Index</h2> 

To jest mój kod:

EmployeeController.cs

// GET: /Employee/ 
    public ActionResult Index() 
    { 
     return View(_repository.ListEmployees()); 
    } 

LinqEmployeeManagerRepository.cs

public class LinqEmployeeManagerRepository: RepositoryExample.Models.IEmployeeManagerRepository 
{ 
    private DeptDirectoryDataClassesDataContext _db = new DeptDirectoryDataClassesDataContext(); 

    public Employee GetEmployee(string UserName) 
    { 
     return (from e in _db.Employees where e.UserName == UserName select e).FirstOrDefault(); 
    } 

    public IEnumerable<Employee> ListEmployees() 
    { 
     return _db.Employees.ToList(); 
    } 

    public Employee CreateEmployee(Employee employeeToCreate) 
    { 
     _db.Employees.InsertOnSubmit(employeeToCreate); 
     _db.SubmitChanges(); 
     return employeeToCreate; 
    } 

    public Employee EditEmployee(Employee employeeToEdit) 
    { 
     var OriginalEmployee = GetEmployee(employeeToEdit.UserName); 
     _db.Employees.Attach(employeeToEdit, OriginalEmployee); 
     _db.SubmitChanges(); 
     return employeeToEdit; 
    } 

    public void DeleteEmployee(Employee employeeToDelete) 
    { 
     var OriginalEmployee = GetEmployee(employeeToDelete.UserName); 
     _db.Employees.DeleteOnSubmit(OriginalEmployee); 
     _db.SubmitChanges();  
    } 
} 

IEmploy eeManagerRepository.cs

namespace RepositoryExample.Models 
{ 
    public interface IEmployeeManagerRepository 
    { 
     Employee CreateEmployee(Employee employeeToCreate); 
     void DeleteEmployee(Employee employeeToDelete); 
     Employee EditEmployee(Employee employeeToUpdate); 
     Employee GetEmployee(string UserName); 
     IEnumerable<Employee> ListEmployees(); 
    } 
} 

Wszelkie pomysły, co robię źle? Próbuję postępować zgodnie z przykładem na wzór repozytorium w tym samouczku: http://www.asp.net/mvc/tutorials/iteration-4-make-the-application-loosely-coupled-cs.

Odpowiedz

15

W górnej części widoku Index.cshtml wymienić:

@model RepositoryExample.Models.IEmployeeManagerRepository 

z:

@model IEnumerable<RepositoryExample.Employee> 

Sposób _repository.ListEmployees() zwraca IEnumerable<Employee> i to, co przechodzą do widoku tutaj:

return View(_repository.ListEmployees()); 

To jest typ, którego powinieneś używać wDyrektywaw twoim widoku.

+0

OK, zrobiłem to, ale teraz dostałem nowy błąd: Opis: Wystąpił błąd podczas kompilacji zasobu wymaganego do obsługi tego żądania. Zapoznaj się z poniższymi szczegółowymi informacjami o błędach i odpowiednio zmodyfikuj swój kod źródłowy. Komunikat o błędzie kompilatora: CS0234: Nazwa typu lub obszaru nazw "Pracownik" nie istnieje w obszarze nazw "RepositoryExample.Models" (czy brakuje odniesienia do zespołu?) – MikeB55

+0

@ MikeB55, OK, użyj poprawnej przestrzeni nazw, w której to 'Pracownik 'klasa jest zdefiniowana. '@model IEnumerable '. Zaktualizowałem swoją odpowiedź. –

+0

Doskonały. Dziękuję bardzo. Szukałem tego błędu przez ostatnie 3 godziny. Mam to teraz do pracy, dodając @model IEnumerable zgodnie z sugestią. – MikeB55

Powiązane problemy