在MVC 3中从Controller到View访问分组

时间:2011-12-21 11:21:16

标签: asp.net-mvc asp.net-mvc-3

如何在View中编写代码以访问linq中的groupby字段。这里的数据是通过Web服务呈现的。

    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());
    }
}

1 个答案:

答案 0 :(得分:4)

您正在将匿名对象传递给您的视图。匿名对象由编译器作为内部发出。内部类只能在同一个程序集中使用。 ASP.NET MVC视图由ASP.NET运行时在单独的程序集中动态编译。这基本上意味着您无法访问视图中控制器操作中创建的匿名类型。因此,这意味着您绝对不应该将匿名对象传递给您的视图。因此,如果您无法传递匿名对象,请通过创建一个命名对象来传递。在这种情况下,它们将被称为视图模型。视图模型是您专门定义的类,以满足视图的要求。

那么在设计ASP.NET MVC应用程序时,您应该问自己的第一个问题是视图的要求是什么?好吧,在这种情况下,您似乎需要一些属性(formattednameidassocmemprox)。好的,让我们写一个视图模型:

// 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());
}

好的,现在您可以强烈地键入此视图模型的视图,并根据需要显示它包含的信息:

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