如何在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());
}
}
答案 0 :(得分:4)
您正在将匿名对象传递给您的视图。匿名对象由编译器作为内部发出。内部类只能在同一个程序集中使用。 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; }
}
然后让您的操作将此视图模型传递给视图:
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>
...
}