Scorrere i dati digitati anonimi nella vista MVC
-
08-07-2019 - |
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?
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();