2016-12-25 40 views
2

我想在MVC 5中使用Entity Framework來獲得一些特定的列值。但是它向我顯示了錯誤。這是我的控制器的方法的代碼:在MVC 5中使用EF選擇特定的列5

public ActionResult Index() 
{ 
    var systemUsers = db.SystemUsers 
         .Include(s => s.SystemUser1) 
         .Select(s => new { 
              s.FullName, 
              s.Email, 
              s.Image, 
              s.UpdateDate, 
              s.UpdatedBy, 
              s.Id 
           }); 
    return View(systemUsers.ToList()); 
} 

這是錯誤消息:

模型項傳遞到字典類型的「System.Collections.Generic.List 1[<>f__AnonymousType1 6 [系統。 String,System.String,System.String,System.Nullable 1[System.DateTime],System.Nullable 1 [System.Int32],System.Int32]]',但該字典需要類型爲'System.Collections.Generic.IEnumerable`1 [MVC。 Models.SystemUser]」。

再次,當我無法獲得具體列的單一結果。默認情況下,控制器方法在嘗試使用ajax時也返回意外的外鍵數據。 以下是單一結果的代碼。

[HttpPost] 
public ActionResult Details(int? id) 
{ 
    if (id == null) 
    { 
     return new HttpStatusCodeResult(HttpStatusCode.BadRequest); 
    } 
    SystemUser systemUser = db.SystemUsers.Find(id); 
    return Json(systemUser); 
} 

Here is the result in console

+2

你聽說過查看模型?谷歌它 –

+1

該視圖需要一個強類型的視圖模型,但你傳遞一個匿名類型。 – Nkosi

+0

@Nkosi,在哪裏編輯我的代碼? –

回答

3

視圖需要一個強類型的視圖模型,但你傳遞一個匿名類型

更新選擇返回一個強類型的對象集合。

public ActionResult Index() 
{ 
    var systemUsers = db.SystemUsers 
         .Include(s => s.SystemUser1) 
         .Select(s => new SystemUser { //<--HERE 
             FullName = s.FullName, 
             Email = s.Email, 
             Image = s.Image, 
             UpdateDate = s.UpdateDate, 
             UpdatedBy = s.UpdatedBy, 
             Id = s.Id 
           }); 
    return View(systemUsers.ToList()); 
} 
1

這裏的問題似乎是,你的看法是期待一個IEnumerable<SystemUser>視圖模型,而是你是供給anonymous type實例。這就是編譯器失敗的原因。有幾種方法來解決這個問題:

1 - 讓你的查看參加一個dynamic模式:你會不會擔心在傳遞的實際實例的類型,但是你不會有自動完成的細節智能感應

2-別項目(.Select)您的收藏和原SystemUser列表傳遞給查看

3-創建一個視圖模型,使這樣的視圖模型的列表,並傳遞到視圖:

控制器:

public ActionResult Index() 
{ 
    var systemUsers = db.SystemUsers 
        .Include(s => s.SystemUser1) 
        .Select(s => new SystemUserViewModel 
          { 
           FullName = s.FullName, 
           Email = s.Email, 
           Image = s.Image, 
           UpdateDate = s.UpdateDate, 
           UpdatedBy = s.UpdatedBy, 
           Id = s.Id 
          }); 
    return View(systemUsers) 
} 

IMHO的第三是最好的一個。當然,你應該使用最適合你的需求。希望這個幫助

+0

他的代碼很糟糕,它包含控制器中的查詢,現在您建議他將查詢'SystemUsers'一路發送到視圖?這是一個很好的建議嗎?我會刪除你的第二個建議。 – CodingYoshi

+0

@CodingYoshi,大聲笑,我試圖提供不同的建議,並試圖傳達「Views」和「ViewModels」是如何工作的,而不是太過自以爲是。這就是爲什麼我建議第三個解決方案 – Luiso

+0

但這不是一個好建議,所以不應該建議。 – CodingYoshi