我将匿名类型的结果放入一些 View 数据中:
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 View 中迭代此 View 数据并制作结果表?
最佳答案
在您的情况下,创建一个模型来保存数据比使用匿名类型要简单得多。
您遇到的问题是,当您的匿名类型存储在 ViewData 中时,该类型会被强制转换为对象。在 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()
};
}
在你的 Controller 中执行以下操作:
public ActionResult Index()
{
return View("Index", Project.RetrieveAllProjects());
}
并在 View 的代码隐藏中,强类型化:
//snip
public partial class Index : ViewPage<IEnumerable<Project>>
{
//snip
您可能认为放置所有这些模型有点浪费,但如果您明智地使用模型,它会更容易理解,并且会使您的 UI 代码更加简洁。
此外,模型是放置加载数据和构建模型本身的逻辑的好地方(事实上,应该是您执行此操作的地方)。想想 ActiveRecord。而且,当您对所有这些进行编码时,请意识到像 SubSonic 这样的项目可以为您创建模型,没有任何困惑或大惊小怪。
关于c# - 在 MVC View 中迭代匿名类型数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/284637/