2012-05-01 65 views
1

這是控制器:LINQ的選擇加入剃刀頁面顯示

public ActionResult Index() 
{ 

    var result = from u in myContext.Users 
      join g in myContext.Groups 
      on u.gid equals g.id 
      select new { 
       u.username, 
       g.name 
      }; 

    return View(result); 
} 

這是查看

@model IEnumerable<eTravel1.Models.User> 
... 
@Html.DisplayNameFor(model => model.username) 
@Html.DisplayNameFor(model => model.name) 
.. 

返回的匿名數據不兼容視圖。 如果有人能提供一些建議,我真的會讚賞它。由於

+0

一方面,您的剃鬚刀腳本正在尋找「firstName」屬性,但您的匿名類型使用「username」來代替。 – brightgarden

+0

對不起,我的錯。它應該是model.username。 –

回答

3

您應該創建一個視圖模型類是這樣的:

public class UserViewModel{ 

    //class constructor 
    public UserViewModel(String userName_p, String name_p){ 
     this.UserName = userName_p; 
     this.Name = name_p; 
    } 

    //class attributes 
    String UserName {get; set;} 
    String Name {get; set;} 
} 

創建一個類的對象:

var result = from u in myContext.Users 
       join g in myContext.Groups 
       on u.gid equals g.id 
       select new UserViewModel(
        u.username, 
        g.name 
       ); 

最後,把這個對象傳遞到您的視圖以同樣的方式:

//returning an IEnumerable<UserViewModel> data type 
return View(result.AsEnumerable()); 

在您的視圖中,您應該預期此數據類型完全相同:

//change the UserViewModel to your complete namespace! 
@model IEnumerable<UserViewModel> 

我強烈建議你閱讀this有關「視圖模型最佳實踐」計算器問題。

希望它有幫助!

+0

感謝您的快速響應!當使用 時,選擇新的UserViewModel {用戶名, } g.name }; 無法使用集合初始值設定項初始化「UserViewModel」類型,因爲它沒有實現「System.Collections.IEnumerable」消息。 同樣看來,我該如何使用兩種模型? (因爲我使用用戶和組表)非常感謝。 –

+0

你如何定義變量'var result'?您是否將構造函數添加到類UserViewModel? –

+0

我剛剛編輯了我的答案,它應該是'new UserViewModel(u.username,g.name);'...... change {}爲() –