2011-12-21 34 views
1

如何在View中編寫代碼以便訪問linq中的groupby字段。這裏的數據通過Web服務呈現。從控制器訪問組中的字段到MVC中的視圖3

public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     ViewBag.Message = "Find Member"; 
     var obj = new SearchMemberServiceClient(); 
     List<MemberProxy> members = obj.FindMember("Mason", "Birkes", "", "", "", "").Members; 

     var sorted = from a in members 
        orderby a.FirstName ascending 
        group a by new { a.FormattedFullName, a.PersonId, a.Associations, a.MembershipsProxy[0].MembershipId } into k 
        select new { formattedname = k.Key.FormattedFullName, id = k.Key.PersonId, assoc = k.Key.Associations, memprox = k.Key.MembershipId }; 

     return View(sorted.ToList()); 
    } 
} 

回答

4

您正在將一個匿名對象傳遞給您的視圖。匿名對象由編譯器以內部方式發出。內部類只能在同一個程序集中使用。 ASP.NET MVC視圖由獨立程序集中的ASP.NET運行時動態編譯。這基本上意味着你不能訪問視圖內的控制器操作中創建的匿名類型。因此,這意味着您絕對不應將匿名對象傳遞給您的視圖。因此,如果您無法傳遞匿名對象,那麼通過創建一個命名對象來傳遞。在這種情況下,它們將被稱爲視圖模型。視圖模型是您爲了滿足視圖要求而專門定義的類。

那麼你的視圖的要求是什麼,你應該問自己在設計ASP.NET MVC應用程序時應該問的第一個問題?那麼,在這種情況下,你似乎需要一些屬性(formattedname,id,assocmemprox)。太好了,讓我們寫一個視圖模型:

// you probably want to find a more suitable name 
public class MyViewModel 
{ 
    public int Id { get; set; } 
    public int MemProx { get; set; } 
    public string FormattedName { get; set; } 
    public IEnumerable<Association> Associations { get; set; } 
} 

,然後讓你的行動通過此視圖模型到視圖:

public ActionResult Index() 
{ 
    var obj = new SearchMemberServiceClient(); 
    var members = obj.FindMember("Mason", "Birkes", "", "", "", "").Members; 

    IEnumerable<MyViewModel> sorted = 
     from a in members 
     orderby a.FirstName ascending 
     group a by new 
     { 
      a.FormattedFullName, 
      a.PersonId, 
      a.Associations, 
      a.MembershipsProxy[0].MembershipId 
     } into k 
     select new MyViewModel 
     { 
      FormattedName = k.Key.FormattedFullName, 
      Id = k.Key.PersonId, 
      Associations = k.Key.Associations, 
      MemProx = k.Key.MembershipId 
     }; 

    return View(sorted.ToList()); 
} 

OK,現在你可以強烈地輸入您的視圖這個視圖模型和現在它包含的信息卻是你想要的:

@model IEnumerable<MyViewModel> 
@foreach (var item in Model) 
{ 
    <div>@item.FormattedName</div> 
    ... 
} 
+0

非常感謝你的詳細解釋。我現在能夠理解流程。 – Krishh 2011-12-21 17:25:00

相關問題