2008-11-12 2 views
2

В каких-то виде данных я клал результат анонимного типа:Итерация через анонимный набраны данные ввиду MVC

  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 на переднем конце, чтобы сказать , составить таблицу результатов?

+0

I сторона с маркой и волю. Использование реальных классов моделей для инкапсуляции данных модели и бизнес-логики делает код более понятным и более простым в обслуживании для очень незначительных затрат на создание класса (необходимость в любом случае с проектом, управляемым доменом). – 2009-06-02 16:40:39

ответ

5

В вашем случае было бы гораздо проще создать модель для хранения ваших данных, а не использовать анонимный тип.

Проблема, с которой вы сталкиваетесь, заключается в том, что ваш анонимный тип передается объекту, когда он хранится в 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, создают ваши модели для вас без каких-либо проблем или суеты.

+0

Спасибо, что ответит. Я вижу вашу точку зрения, я как бы надеялся, что каким-то образом я смогу использовать типы анонов в своем интерфейсе, но я думаю, что не без него быть слишком чистым. Я ненавижу создавать классы отображения :) – qui 2008-11-12 17:28:06

0

Проблема не в том, что это анонимный тип. Проблема в том, что это всего лишь ленивый объект IQueryable <>, и он еще не оценен.

Я не могу ответить на ASP.NET MVC, но в очень похожем монорельсе, вы должны преобразовать его из итератора в актуальную коллекцию:

 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(); 
1

Не пробовал это с анонимным типом, но это, как я это сделать, передав List<T> объект ViewData

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

Надежда это то, что ищет.

Mark

Смежные вопросы