В вашем случае было бы намного проще создать модель для хранения ваших данных, чем использовать анонимный тип.
Проблема, с которой вы столкнулись, заключается в том, что ваш анонимный тип приводится к объекту, когда он хранится в ViewData. Со стороны пользовательского интерфейса, когда вы извлекаете этот объект, единственный способ получить доступ к его свойствам - использовать отражение. Вы НЕ хотите делать это в своем пользовательском интерфейсе. Это будет в высшей степени некрасиво. Вместо этого просто добавьте в свои модели следующий класс:
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, создают ваши модели без лишних хлопот и суеты.
person
Community
schedule
12.11.2008