Pregunta

¿Cómo hago para pasar dos conjuntos de datos a una vista en ASP.NET MVC?

He intentado un par de cosas y ninguna ha funcionado, así que he llegado a la simple conclusión: Lo estoy haciendo mal.

Tengo 2 consultas:

callRepository.FindOpenCalls () y callRepository.FindAllMyCalls(user)

y quiero colocar ambos conjuntos de datos en una vista a través de 2 vistas parciales (OpenCalls.ascx y AssignedCalls.ascx respectivamente).

Me gustaría hacer esto usando la función Index () en mi CallsController.vb.

Por el momento tengo:

'
' 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

Lo que obviamente devuelve solo las llamadas abiertas, pero me gustaría devolver tanto viewOpenCalls como viewMyOpenCalls.

¿Cómo lo haría?

¿Mostraría mi ayuda LINQ?

Gracias por cualquier ayuda por adelantado.

¿Fue útil?

Solución

La mejor manera de pasar datos a una vista es tener un ViewData específico para su vista, que contenga solo los datos necesarios.

En lugar de tener cadenas mágicas ( ViewData (" MyOpenCallCount ") ) defina una clase específica que contenga todos los datos necesarios para esta vista (perdón si mi VB.Net está un poco oxidado):

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

Y use una vista fuertemente tipada derivada de ViewPage (of CallViewData) , de esta manera tiene inteligencia y no necesita luchar con cadenas codificadas para obtener su información.

Rellena CallViewData con información de todas las llamadas y de las llamadas de usuario actuales, devuelva esta instancia.

   Dim data as new CallViewData
   data.AllCalls = new CallInfo {OpenCallCount = ...  }
   'etc
   return View(data)

Otros consejos

No tiene que asignar elementos de datos a ViewData por partes de la manera que lo está haciendo. Si por alguna razón no puede pasar los objetos CallRepository, puede crear y otro objeto de datos que mantendrá sus datos abiertos y todas las llamadas y los pasará.

Y ese es un diseño que en realidad es mucho más flexible a largo plazo.

Puede almacenar su ViewData en un objeto modelo y pasarlo. Esto se explica muy bien en PRO ASP.NET MVC capítulo 9 .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top