Come passare due serie di dati a una vista?
-
10-07-2019 - |
Domanda
Come posso fare per passare due set di dati a una vista in ASP.NET MVC?
Ho provato un paio di cose e nessuno dei due ha funzionato, quindi sono giunto alla semplice conclusione: Sto sbagliando.
Ho 2 domande:
callRepository.FindOpenCalls ()
e callRepository.FindAllMyCalls(user)
e voglio mettere entrambi i set di dati in una vista tramite 2 viste parziali (rispettivamente OpenCalls.ascx e AssignedCalls.ascx).
Mi piacerebbe farlo usando la funzione Index () nel mio CallsController.vb.
Al momento ho:
'
' GET: /Calls/
<Authorize()> _
Function Index() As ActionResult
ViewData("OpenCallCount") = callRepository.CountOpenCalls.Count()
ViewData("UrgentCallCount") = callRepository.CountUrgentCalls.Count()
ViewData("HighCallCount") = callRepository.CountHighCalls.Count()
ViewData("NormalCallCount") = callRepository.CountNormalCalls.Count()
ViewData("LowCallCount") = callRepository.CountLowCalls.Count()
ViewData("MyOpenCallsCount") = callRepository.CountMyOpenCalls(Session("LoggedInUser")).Count()
ViewData("UserName") = Session("LoggedInUser")
Dim viewOpenCalls = callRepository.FindAllOpenCalls()
Dim viewMyOpenCalls = callRepository.FindAllMyCalls(Session("LoggedInUser"))
Return View(viewOpenCalls)
End Function
Che ovviamente restituisce solo le chiamate aperte, ma vorrei restituire sia viewOpenCalls che viewMyOpenCalls.
Come potrei farlo?
Mostrando il mio aiuto LINQ?
Grazie per l'aiuto in anticipo.
Soluzione
Il modo migliore per passare i dati a una vista è in realtà avere un ViewData specifico per la tua vista, contenente solo i dati necessari.
Invece di avere stringhe magiche ( ViewData (" MyOpenCallCount ")
) definisci una classe specifica contenente tutti i dati necessari per questa vista (scusami se il mio VB.Net è un po 'arrugginito):
public class CallInfo
public OpendCallCount as int
public UrgentCallCount as int
'etc.
end class
public class CallViewData
public AllCalls as CallInfo
public MyCalls as CallInfo
public UserName as String
end class
E usa una vista fortemente tipizzata derivante da ViewPage (di CallViewData)
, in questo modo hai intellisense e non hai bisogno di lottare con stringhe hardcoded per ottenere le tue informazioni.
Popolare CallViewData con le informazioni di entrambe le chiamate e delle chiamate dell'utente corrente, restituisce questa istanza.
Dim data as new CallViewData
data.AllCalls = new CallInfo {OpenCallCount = ... }
'etc
return View(data)
Altri suggerimenti
Non è necessario assegnare elementi di dati a ViewData in modo frammentario come si sta facendo. Se per qualche motivo non è possibile passare gli oggetti CallRepository, è possibile creare e un altro oggetto dati che manterrà aperti e tutti i dati del repository delle chiamate e li passerà.
E questo è un design che in realtà è molto più flessibile a lungo termine.
È possibile memorizzare ViewData in un oggetto modello e passarlo. Questo è spiegato molto bene nel capitolo 9 di ASP ASP ASPCNET MVC .