Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在MVC视图中遍历匿名类型数据_C#_Asp.net Mvc_Anonymous Types - Fatal编程技术网

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) %>
<% } %>