Domanda

In alcuni dati di visualizzazione ho inserito il risultato di un tipo anonimo:

            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;

Come posso scorrere questi dati della vista nella vista MVC sul front-end per dire, creare una tabella di risultati?

È stato utile?

Soluzione

Nel tuo caso sarebbe molto più semplice creare un modello per conservare i tuoi dati piuttosto che usare un tipo anonimo.

Il problema che stai riscontrando è che il tuo tipo anonimo viene trasmesso a un oggetto quando è archiviato in ViewData. Sul lato dell'interfaccia utente, quando si ottiene quell'oggetto, l'unico modo per accedere alle sue proprietà è utilizzare la riflessione. NON vuoi farlo nella tua UI. Sarà molto brutto. Invece, aggiungi la seguente classe ai tuoi Modelli:

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

Nel controller fai questo:

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

e nel codice dietro la tua vista, digita fortemente così:

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

Potresti pensare che sia un po 'dispendioso avere tutti questi modelli in giro, ma è molto più facile da capire e rende il tuo codice UI molto più snello, se usi i tuoi modelli con saggezza.

Inoltre, un modello è un ottimo posto (e, in effetti, dovrebbe essere dove lo fai) per posizionare la logica per caricare i tuoi dati e costruire i modelli stessi. Pensa ad ActiveRecord. E, mentre stai programmando tutto questo, renditi conto che progetti come SubSonic creano i tuoi modelli per te senza problemi o storie.

Altri suggerimenti

Non l'ho provato con un tipo anonimo ma è così che faccio passando un List<T> oggetto a ViewData

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

Spero che questo sia quello che stai cercando.

Mark

Il problema non è che si tratta di un tipo anonimo. Il problema è che è semplicemente IQueryable & Lt; & Gt; oggetto e non è stato ancora valutato.

Non posso rispondere per ASP.NET MVC, ma nella monorotaia molto simile, dovresti convertirlo da un iteratore in una vera raccolta:

        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();
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top