C# 在MVC视图中遍历匿名类型数据
在某些视图数据中,我将匿名类型的结果放入:C# 在MVC视图中遍历匿名类型数据,c#,asp.net-mvc,anonymous-types,C#,Asp.net Mvc,Anonymous Types,在某些视图数据中,我将匿名类型的结果放入: var projectData = from p in db.Projects orderby p.title select new { Title = p.title,
var projectData = from p in db.Projects
orderby p.title
select new
{
Title = p.title,
DevURL = p.devURL ?? "N/A",
QAURL = p.qaURL ?? "N/A",
LiveURL = p.liveURL ?? "N/A",
Users = p.GetUsers().MakeUserList()
};
ViewData["ProjectSummary"] = projectData;
如何在前端的MVC视图中迭代该视图数据,以生成结果表?问题不在于它是匿名类型。问题是,它只是一个懒惰的可计算对象,而且还没有被计算 我不能回答ASP.NET MVC,但在非常类似的Monorail中,您必须将其从迭代器转换为实际集合:
var projectData = (from p in db.Projects
orderby p.title
select new
{
Title = p.title,
DevURL = p.devURL ?? "N/A",
QAURL = p.qaURL ?? "N/A",
LiveURL = p.liveURL ?? "N/A",
Users = p.GetUsers().MakeUserList()
}).ToList();
在您的情况下,创建一个模型来保存数据要比使用匿名类型简单得多 您遇到的问题是,当匿名类型存储在ViewData中时,它会被强制转换为对象。在UI方面,当您取出该对象时,访问其属性的唯一方法是使用反射。您不希望在UI中执行此操作。这将是非常丑陋的。相反,只需将以下类添加到模型中:
public class Project{
public string Title {get;set;}
public string DevUrl {get;set;}
public string QAUrl {get;set;}
public string LiveUrl {get;set;}
public IEnumerable<User> Users {get;set;}
public static IEnumerable<Project> RetrieveAllProjects()
{
return from p in db.Projects
orderby p.title
select new Project
{
Title = p.title,
DevURL = p.devURL ?? "N/A",
QAURL = p.qaURL ?? "N/A",
LiveURL = p.liveURL ?? "N/A",
Users = p.GetUsers().MakeUserList()
};
}
在视图的codebehind中,强烈键入:
//snip
public partial class Index : ViewPage<IEnumerable<Project>>
{
//snip
//snip
公共部分类索引:ViewPage
{
//剪断
您可能会认为将所有这些模型放在一起有点浪费,但如果您明智地使用模型,它会更容易理解,并使您的UI代码更精简
此外,模型是一个很好的地方(事实上,它应该在你做的地方)要放置加载数据和构建模型本身的逻辑,请考虑ActiveRecord。在编写所有这些代码的同时,请意识到亚音速等项目可以毫无混乱地为您创建模型。没有尝试匿名类型,但我是通过将
列表
对象传递到视图来实现这一点的数据
<% foreach (Project p in (IEnumerable<Project>)ViewData["ProjectSummary"]) { %>
<%= Html.Encode(p.Title) %>
<% } %>
希望这就是你想要的
Mark谢谢你的回复Will。我明白你的意思,我有点希望我能在前端代码中使用非类型,但我想这不是因为它太干净。我讨厌创建显示类:)你的显示类应该封装这些类的加载逻辑。你不应该在你的控制台中加载数据这不是他们的工作描述。因此,你不必把它们看作垃圾…我站在马克和Wr.。使用实际的模型类来封装模型数据和业务逻辑,使代码更清晰,更容易维护,因为创建类的非常小的成本(无论如何都需要一个域驱动的设计)。
<% foreach (Project p in (IEnumerable<Project>)ViewData["ProjectSummary"]) { %>
<%= Html.Encode(p.Title) %>
<% } %>