В вашем случае было бы гораздо проще создать модель для хранения ваших данных, а не использовать анонимный тип.
Проблема, с которой вы сталкиваетесь, заключается в том, что ваш анонимный тип передается объекту, когда он хранится в 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
You может подумать, что это немного расточительно, чтобы все эти модели лежали вокруг, но его намного легче понять, и делает ваш код пользовательского интерфейса намного более тонким, если вы разумно используете свои модели.
Кроме того, модель - отличное место (и, фактически, должно быть там, где вы это делаете), чтобы разместить логику для загрузки ваших данных и построения самих моделей. Подумайте о ActiveRecord. И, хотя вы все это кодируете, поймите, что такие проекты, как SubSonic, создают ваши модели для вас без каких-либо проблем или суеты.
I сторона с маркой и волю. Использование реальных классов моделей для инкапсуляции данных модели и бизнес-логики делает код более понятным и более простым в обслуживании для очень незначительных затрат на создание класса (необходимость в любом случае с проектом, управляемым доменом). – 2009-06-02 16:40:39