ASP.NET devolviendo múltiples variables a la vista

Estoy teniendo problemas para averiguar cómo devolver varias variables a una vista. Algo como esto. ¿Puedo obtener un poco de ayuda?

public ActionResult CheatSheet() { var var1 = from ts in db.thisdatabase select ts; var var2 = from ls in db.thisdatabase select ls; var var3 = from d in db.thisdatabase select d; return View(var1,var2,var3); } 

Considere el uso de un ViewModel

Querrá usar un ViewModel para componer todos estos resultados diferentes y pasar ese modelo a la Vista:

 public class ExampleViewModel { // Example collections for each of your types public IEnumerable CollectionA { get; set; } public IEnumerable CollectionB { get; set; } public IEnumerable CollectionC { get; set; } } 

Y luego use algo como el siguiente código para realizar sus consultas específicas y use los resultados de esas consultas para construir su modelo y luego pasarlo a la Vista:

 // Build the model var model = new ExampleViewModel(){ // You'll likely want a .ToList() after these to ensure things work as expected CollectionA = db.thisdatabase.Select(x => x.ts), CollectionB = db.thisdatabase.Select(x => x.ts), CollectionC = db.thisdatabase.Select(x => x.ts), }; // Pass it to your View return View(model); 

Nota: Esto supone que en realidad no está consultando la misma tabla exacta con cada una de sus consultas. Si ese fue el caso, entonces puede ser más eficiente retirar una sola colección con cada una de sus propiedades y luego asignar sus colecciones individuales de propiedades al modelo (en lugar de realizar consultas múltiples, posiblemente redundantes).

Luego, dentro de la Vista, puede hacer referencia a las colecciones de propiedades subyacentes como se espera e iterar a través de ellas o realizar cualquier otro tipo de operaciones:

 @model YourProject.ViewModels.ExampleViewModel @foreach (var item in Model.CollectionA) { ... } @foreach (var item in Model.CollectionB) { ... } @foreach (var item in Model.CollectionC) { ... } 

Para escenarios más complejos

Si no desea simplemente acceder a una sola columna desde su base de datos sino a múltiples, probablemente querrá crear otro modelo / clase para asignar sus propiedades y luego almacenar instancias de esas dentro de su ViewModel.

Veamos su ejemplo y veamos cómo podría funcionar. Por lo tanto, actualmente está buscando almacenar las propiedades ts , ls y d , así que hagamos una clase para almacenarlas en:

 public class Example { public string Ts { get; set; } public string Ls { get; set; } public string D { get; set; } } 

Ahora, cuando realice su consulta, simplemente tome todos estos y mapéelos dentro de una llamada Select() :

 // This will now be an IEnumerable var models = db.thisdatabase.Select(x => new Example() { Ts = x.ts, Ls = x.ls, D = d }); 

Ahora puede pasar esto directamente a su Vista si eso es todo lo que necesita:

 // If you did this, you'd need to adjust your @model declaration return View(model); 

O puede realizar varios de estos si necesita construir diferentes modelos para diferentes tablas y luego comstackr todas esas colecciones en un ViewModel similar al del ejemplo original:

 var model = new ExampleViewModel(){ CollectionA = db.thisdatabase.Select(x => new Example(x)), CollectionB = db.othertable.Select(x => new OtherExample(x)), CollectionC = db.yetanother.Select(x => new LastExample(x)) }; 

Otras formas de almacenamiento

Hay algunos otros enfoques que podría considerar dependiendo de sus necesidades, como el uso de la colección ViewBag . El ViewBag es una colección dinámica que le permite almacenar y acceder fácilmente a los objetos dentro de la Vista:

 ViewBag.A = db.thisdatabase.Select(x => x.ts), ViewBag.B = db.thisdatabase.Select(x => x.ts), ViewBag.C = db.thisdatabase.Select(x => x.ts), return View(); 

Básicamente, esto funcionará de la misma manera, pero en lugar de referencias a @Model dentro de su Vista, solo usaría @ViewBag en @ViewBag lugar. También vale la pena señalar que esto también puede usarse junto con un modelo real.

Existen otros enfoques, como el uso de las colecciones ViewData o Session , pero realmente debería usar un modelo. Está más en línea con el patrón MVC real, y si te acostumbras, debería hacerte la vida mucho más fácil.

Puede pasar dynamic modelo dynamic en su vista usando ExpandoObject .

Ejemplo:

Controlador:

  public ExpandoObject ToExpando( object anonymousObject) { IDictionary anonymousDictionary = new RouteValueDictionary(anonymousObject); IDictionary expando = new ExpandoObject(); foreach (var item in anonymousDictionary) expando.Add(item); return (ExpandoObject)expando; } public ActionResult CheatSheet() { var var1 = from ts in db.thisdatabase select ts; var var2 = from ls in db.thisdatabase select ls; var var3 = from d in db.thisdatabase select d; var model= ToExpando(new{ var1 =var1 ,var2 =var2 , var3 =var3}) return View(model); } 

Ver:

 @foreach (var item in Model.var1 ) { ... } @foreach (var item in Model.var2 ) { ... } @foreach (var item in Model.var3 ) { ... }