Asp.net mvc 在MVC 3中从控制器访问分组字段以查看

Asp.net mvc 在MVC 3中从控制器访问分组字段以查看,asp.net-mvc,asp.net-mvc-3,Asp.net Mvc,Asp.net Mvc 3,如何在视图中编写代码以访问linq中的groupby字段。在这里,数据是通过web服务呈现的 public class HomeController : Controller { public ActionResult Index() { ViewBag.Message = "Find Member"; var obj = new SearchMemberServiceClient(); List<MemberProx

如何在视图中编写代码以访问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());
    }
}
公共类HomeController:控制器
{
公共行动结果索引()
{
ViewBag.Message=“查找成员”;
var obj=新的SearchMemberServiceClient();
List members=obj.FindMember(“梅森”、“伯克斯”、“我”、“我”、“我”、“我”)。成员;
var sorted=来自成员中的
orderby a.FirstName升序
将a组按新的{a.FormattedFullName,a.PersonId,a.Associations,a.MembershipProxy[0].MembershipId}放入k
选择新的{formattedname=k.Key.FormattedFullName,id=k.Key.PersonId,assoc=k.Key.Associations,memprox=k.Key.MembershipId};
返回视图(sorted.ToList());
}
}

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

因此,在设计ASP.NET MVC应用程序时,您应该首先问自己视图的要求是什么?在这种情况下,您似乎需要几个属性(
formattedname
id
assoc
memprox
)。很好,让我们编写一个视图模型:

// 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; }
}
//您可能想找到一个更合适的名称
公共类MyViewModel
{
公共int Id{get;set;}
public int MemProx{get;set;}
公共字符串格式化名称{get;set;}
公共IEnumerable关联{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());
}
public ActionResult Index()
{
var obj=新的SearchMemberServiceClient();
var members=obj.FindMember(“Mason”、“Birkes”、、、、、).members;
IEnumerable排序=
来自成员中的某个成员
orderby a.FirstName升序
a组由纽约
{ 
a、 格式化的全名,
a、 人格,
a、 协会,
a、 MembershipProxy[0]。成员身份ID
}进入k
选择新的MyViewModel
{ 
FormattedName=k.Key.FormattedFullName,
Id=k.Key.PersonId,
关联=k.Key.Associations,
MemProx=k.Key.MembershipId
};
返回视图(sorted.ToList());
}
好的,现在您可以强式键入此视图模型的视图,并以所需方式显示其中包含的信息:

@model IEnumerable<MyViewModel>
@foreach (var item in Model)
{
    <div>@item.FormattedName</div>
    ...
}
@model IEnumerable
@foreach(模型中的var项目)
{
@item.FormattedName
...
}

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

因此,在设计ASP.NET MVC应用程序时,您应该首先问自己视图的要求是什么?在这种情况下,您似乎需要几个属性(
formattedname
id
assoc
memprox
)。很好,让我们编写一个视图模型:

// 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; }
}
//您可能想找到一个更合适的名称
公共类MyViewModel
{
公共int Id{get;set;}
public int MemProx{get;set;}
公共字符串格式化名称{get;set;}
公共IEnumerable关联{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());
}
public ActionResult Index()
{
var obj=新的SearchMemberServiceClient();
var members=obj.FindMember(“Mason”、“Birkes”、、、、、).members;
IEnumerable排序=
来自成员中的某个成员
orderby a.FirstName升序
a组由纽约
{ 
a、 格式化的全名,
a、 人格,
a、 协会,
a、 MembershipProxy[0]。成员身份ID
}进入k
选择新的MyViewModel
{ 
FormattedName=k.Key.FormattedFullName,
Id=k.Key.PersonId,
关联=k.Key.Associations,
MemProx=k.Key.MembershipId
};
返回视图(sorted.ToList());
}
好的,现在您可以强式键入此视图模型的视图,并以所需方式显示其中包含的信息:

@model IEnumerable<MyViewModel>
@foreach (var item in Model)
{
    <div>@item.FormattedName</div>
    ...
}
@model IEnumerable
@foreach(模型中的var项目)
{
@item.FormattedName
...
}

非常感谢您的详细解释。我现在能够理解流程了。非常感谢您的详细解释。我现在能够理解流程了。