¿Cómo debo estructurar mi ViewModel para estos datos jerárquicos que necesito mostrar en ASP.NET MVC?

StackOverflow https://stackoverflow.com/questions/1018679

Pregunta

Tengo una vista que se verá así:

texto alternativo ??

Estoy tratando de descubrir cómo debo representar mi ViewModel para esta vista. Cada " Agencia " puede tener múltiples "Unidades de Negocio" y cada " Unidad de Negocio " puede tener varios " Clientes " ;.

En la base de datos, lo represento fácilmente con una tabla de mapeo y claves externas para las tablas de Agencia, BusinessUnit y Cliente.

Sin embargo, ahora necesito usar LINQ para consultar estos datos fuera de la base de datos y luego construir un objeto ViewModel que represente esta estructura en forma de árbol para que mi Vista pueda representarlo.

¿Alguien puede darme consejos sobre qué estructura de datos debo usar, o cómo se vería mi ViewModel para esta estructura jerárquica en código C #? Necesito crear mi objeto ViewModel para pasar a esta vista.

¡Cualquier sugerencia sobre cómo representar el ViewModel es apreciada!

¿Fue útil?

Solución

¿Simplemente almacena una instancia de Lista en sus datos de vista?

public class Agency
{
   public List<BusinessUnit> Units;
   public string Name;
   public int NumberOfAccounts
   {
      get 
      {
         int ret = 0;
         foreach(BusinessUnit unit in units)
            ret += unit.NumberOfAccounts;
         return ret;
      }
   }
   // ... continue this strategy for other properties
}
public class BusinessUnit
{
   public List<Client> clients;
   public string Name;
   public int NumberOfAccounts
   {
      get 
      {
         int ret = 0;
         foreach(Client client in clients)
            ret += client.NumberOfAccounts;
         return ret;
      }
   }
   // ... continue this strategy for other properties

}
public class Client
{
   public string Name;
   public int NumberOfAccounts;
}

Otros consejos

Suponiendo que su implementación de Linq2Sql tiene las mismas relaciones que la base de datos (que si arrastra y suelta al diseñador, definitivamente lo hacen), así es como lo abordaría.

Crearía una vista parcial fuertemente tipada de tipo Agencia que representaría cada sección (Agencia, en su caso), llámela AgencyReportSection.ascx. Este control tomará una agencia, iterará a través de sus unidades de negocio, que a su vez iterarán a través de sus clientes.

Donde sea que esté empaquetando sus datos, haga algo como esto:

DataContext context = new DataContext();
DataLoadOptions options = new DataLoadOptions();
options.LoadWith<Agency>(a => a.BusinessUnit);
options.LoadWith<BusinessUnit>(b => b.Client); 

context.LoadOptions = options;

Lo que esto le dará es que cuando el contexto obtiene una agencia, seguirá las relaciones definidas y también le dará esos objetos. Entonces obtienes:

Agency a = context.Agency.FirstOrDefault();
IEnumerable<BusinessUnit> units = a.BusinessUnits;
IEnumerable<Client> clients = units.Clients;

Su vista podría hacer algo como:

<% foreach(var agency in agencies)%{>
<% Html.RenderPartial("AgencyReportSection"); %> 
<%}%>

La razón por la que está haciendo la opción de carga de datos es para evitar una carga lenta en la vista, deje que el modelo empaque todos los datos necesarios.

Espero haber entendido su pregunta correctamente ...

Recientemente he estado usando el "Modelo de datos de entidad ADO .Net" plantilla para controlar la conectividad a una base de datos MSSQL que admite datos de jerarquía y ha funcionado bien.

Puede vincular su capa de presentación directamente a los modelos de datos.

Si sus claves están configuradas correctamente en la base de datos, es muy fácil de poner en funcionamiento ... Creo que también requiere ADO.Net 3.5

Creando ADO. Entidad NET Framework Entidad

Información de MS en la entidad

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