2

我将匿名类型的结果放入一些视图数据中:

            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视图中遍历这个视图数据来说,制作一个结果表?

4

3 回答 3

5

在您的情况下,创建一个模型来保存您的数据而不是使用匿名类型会简单得多。

您遇到的问题是您的匿名类型在存储在 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()
             };
}

在您的控制器中执行以下操作:

public ActionResult Index()
{
  return View("Index", Project.RetrieveAllProjects());
}

并在您视图的代码隐藏中,如此强烈地键入它:

//snip
public partial class Index : ViewPage<IEnumerable<Project>>
{
//snip

您可能会认为将所有这些模型放在一边有点浪费,但如果您明智地使用模型,它会更容易理解,并使您的 UI 代码更苗条。

此外,模型是放置加载数据和构建模型本身的逻辑的好地方(事实上,应该是你做它的地方)。想想 ActiveRecord。而且,当您编写所有这些代码时,请意识到像 SubSonic 这样的项目会为您创建模型,而不会有任何麻烦或大惊小怪。

于 2008-11-12T17:18:39.750 回答
1

没有用匿名类型尝试过,但这就是我通过将List<T>对象传递给ViewData

<% foreach (Project p in (IEnumerable<Project>)ViewData["ProjectSummary"]) { %>
     <%= Html.Encode(p.Title) %>
<% } %>

希望这就是你要找的。

标记

于 2008-11-23T21:00:22.070 回答
0

问题不在于它是匿名类型。问题是它只是一个惰性求值的 IQueryable<> 对象,它还没有被求值。

我无法回答 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();
于 2008-11-12T17:10:23.447 回答