2014-04-26 81 views
1

有一個我正在開發的演示MVC項目。我使用Entity framework 5.0創建一個名爲「EmployeeDataModel」的實體數據模型。知道 該實體是AutoGenerated(並且無法更改)中的所有類,並且我想改變關於該模型的一些細節,所以我決定創建一個「EditModel」文件夾,我猜這就是「EditModel」的用途。然後我在該文件夾中創建了一個Parent類,並且我複製了自動生成的Employee.cs類中的幾乎所有內容。然後我使用與EmployeeController的Index方法完全相同的代碼和完全相同的視圖創建了一個控制器類,除了這將被硬編碼爲使用父模型類而不是MVCDemo.Models.Employee。自定義自動生成的索引視圖

但是,當我嘗試運行該頁面時出現此錯誤;

(傳遞到詞典中的模型項的類型爲「System.Collections.Generic.List 1[MVCDemo.Models.Employee]', but this dictionary requires a model item of type 'System.Collections.Generic.IEnumerable 1 [MVCDemo.EditModels.Parent]」)

這意味着我的視圖期待對象的清單,但它正在接收一個對象。 如果我刪除我的視圖的「IEnumerable」部分,只是讓它成爲「@model MVCDemo.EditModels.Parent」它會通過這個錯誤,但我等待列表循環通過的事實仍然存在!在我的控制器我發送一個列表回到視圖「返回視圖(employees.ToList());」

加上當我創建視圖時,如果我選擇內置模型的員工模型,頁面將運行沒有任何問題。如果它返回一個列表,我無法在Employee.cs類中找到任何指示!

請幫我理解這一點。

這是我Employee.cs(自動生成的類)

namespace MVCDemo.Models 
{ 
    using System; 
    using System.Collections.Generic; 

    public partial class Employee 
    { 
     public int EmployeeId { get; set; } 
     public string Name { get; set; } 
     public string Gender { get; set; } 
     public string City { get; set; } 
     public int DepartmentId { get; set; } 

     public virtual Department Department { get; set; } 
    } 

} 

這是我的索引視圖;

@model IEnumerable<MVCDemo.Models.Employee> 

@{ 
    ViewBag.Title = "Index"; 
} 

<h2>Index</h2> 

<p> 
    @Html.ActionLink("Create New", "Create") 
</p> 
<table> 
    <tr> 
     <th> 
      @Html.DisplayNameFor(model => model.Name) 
     </th> 
     <th> 
      @Html.DisplayNameFor(model => model.Gender) 
     </th> 
     <th> 
      @Html.DisplayNameFor(model => model.City) 
     </th> 
     <th> 
      @Html.DisplayNameFor(model => model.Department.DepName) 
     </th> 
     <th></th> 
    </tr> 

@foreach (var item in Model) { 
    <tr> 
     <td> 
      @Html.DisplayFor(modelItem => item.Name) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.Gender) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.City) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.Department.DepName) 
     </td> 
     <td> 
      @Html.ActionLink("Edit", "Edit", new { id=item.EmployeeId }) | 
      @Html.ActionLink("Details", "Details", new { id=item.EmployeeId }) | 
      @Html.ActionLink("Delete", "Delete", new { id=item.EmployeeId }) 
     </td> 
    </tr> 
} 

</table> 

我的父類在EditModel文件夾中;

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using MVCDemo.Models; 
namespace MVCDemo.EditModels 
{ 
    public class Parent 
    { 

     public int EmployeeId { get; set; } 
     public string Name { get; set; } 
     public string Gender { get; set; } 
     public string City { get; set; } 
     public int DepartmentId { get; set; } 

     public virtual Department Department { get; set; } 
    } 
} 

EmployeeController;

namespace MVCDemo.Controllers 
{ 
    public class EmployeeController : Controller 
    { 
     private EmployeeContext db = new EmployeeContext(); 

     // 
     // GET: /Employee/ 

     public ActionResult Index() 
     { 
      var employees = db.Employees.Include(e => e.Department); 
      return View(employees.ToList()); 
     } 

     public ActionResult EmployeeParent() 
     { 
      var employees = db.Employees.Include(e => e.Department); 

      return View(employees.ToList()); 

     } 

和Employeeparent View;

@model IEnumerable<MVCDemo.EditModels.Parent> 

@{ 
    ViewBag.Title = "EmployeeParent"; 
} 

<h2>EmployeeParent</h2> 

<p> 
    @Html.ActionLink("Create New", "Create") 
</p> 
<table> 
    <tr> 
     <th> 
      @Html.DisplayNameFor(model => model.EmployeeId) 
     </th> 
     <th> 
      @Html.DisplayNameFor(model => model.Name) 
     </th> 
     <th> 
      @Html.DisplayNameFor(model => model.Gender) 
     </th> 
     <th> 
      @Html.DisplayNameFor(model => model.City) 
     </th> 
     <th> 
      @Html.DisplayNameFor(model => model.DepartmentId) 
     </th> 
     <th></th> 
    </tr> 

@foreach (var item in Model) { 
    <tr> 
     <td> 
      @Html.DisplayFor(modelItem => item.EmployeeId) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.Name) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.Gender) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.City) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.DepartmentId) 
     </td> 
     <td> 
      @Html.ActionLink("Edit", "Edit", new { /* id=item.PrimaryKey */ }) | 
      @Html.ActionLink("Details", "Details", new { /* id=item.PrimaryKey */ }) | 
      @Html.ActionLink("Delete", "Delete", new { /* id=item.PrimaryKey */ }) 
     </td> 
    </tr> 
} 

</table> 

回答

1

該查詢返回List<MVCDemo.Models.Employee>,但鑑於期待和IEnumerable<MVCDemo.EditModels.Parent> ...

var employees = db.Employees.Include(e => e.Department); 

有兩種方法來解決這個...

1)更改的類型該視圖所期望的模型...

@model IEnumerable<MVCDemo.Models.Employee> 

2)或者將查詢更改爲返回列表MVCDemo.EditModels.Parent s ...

using MVCDemo.EditModels; 
// ... 
public ActionResult EmployeeParent() 
{ 
    var parents = db.Employees.Include(e => e.Department) 
         .Select(e => new Parent 
          { 
           EmployeeId = e.EmployeeId, 
           Name = e.Name, 
           Gender = e.Gender, 
           City = e.City, 
           DepartmentId = e.DepartmentId, 
           Department = e.Department 
          }); 
    return View(parents.ToList()); 
} 

如果你的目標是要改變,是由實體框架生成的生成Employee類,EF實際生成模式作爲部分類,這樣你就可以通過創建一個部分類添加到它,它贏得了模型重新生成時不會被覆蓋。例如...

public partial class Employee 
{ 
    public string SomeOtherProperty { get; set; } 
} 
+0

非常感謝您的幫助。我對MVC的概念很陌生,所以我真的不理解我用自動生成的模型類與我寫的模型類之間的區別!原來的querry也返回一個列表,因此該視圖期待IEnumerable,但它工作得很好!但不是用我的代碼? – curiousStudent

+0

問題不在於它是一個List(List實現了IEnumerable,所以這裏沒有問題),問題是列表中的對象的類型。您正在返回一份員工名單,但該視圖正在等待一份家長名單。 –

+0

我看到謝謝!我試圖在我的控制器中插入你給我的數字'2'的代碼,我得到一個編譯器錯誤; 「無法使用集合初始值設定項初始化類型'MVCDemo.EditModels.Parent',因爲它沒有實現'System.Collections.IEnumerable'\t」 – curiousStudent