Visualización de DataTables estándar en MVC

Quizás esto esté completamente equivocado, pero en los días de Webforms, usted devolvería un Dataset que luego vincularía a una grilla. ¿Pero ahora en MVC no se supone que debes pasar una tabla de datos porque no puedes serializarla y está pasando objetos técnicamente a la Vista a la que no pertenece? ¿Pero cómo demonios estoy destinado a mostrar datos en una vista? No puedo usar las clases LINQ to SQL aquí, ya que esta es una estructura de datos pura en memoria.

Idealmente, me gustaría poder tener un objeto que pueda iterar dentro de la vista.

Realmente estoy un poco perdido. He leído el artículo del “Gu” y solo puedo resumir que tengo que devolver un objeto ViewData en su lugar. ¿Me estoy volviendo loco aquí?

Saludos de Blighty

Jon

Esto no está “mal” en absoluto, simplemente no es lo que los chicos geniales suelen hacer con MVC. Como comentario adicional, me gustaría que algunas de las primeras demostraciones de ASP.NET MVC no intenten meter en Linq-to-Sql al mismo tiempo. Es bastante asombroso y adecuado para MVC, claro, pero no es obligatorio. No hay nada en MVC que le impida usar ADO.NET . Por ejemplo:

Acción del controlador:

public ActionResult Index() { ViewData["Message"] = "Welcome to ASP.NET MVC!"; DataTable dt = new DataTable("MyTable"); dt.Columns.Add(new DataColumn("Col1", typeof(string))); dt.Columns.Add(new DataColumn("Col2", typeof(string))); dt.Columns.Add(new DataColumn("Col3", typeof(string))); for (int i = 0; i < 3; i++) { DataRow row = dt.NewRow(); row["Col1"] = "col 1, row " + i; row["Col2"] = "col 2, row " + i; row["Col3"] = "col 3, row " + i; dt.Rows.Add(row); } return View(dt); //passing the DataTable as my Model } 

Vista: (con el modelo fuertemente tipeado como System.Data.DataTable)

  <%foreach (System.Data.DataColumn col in Model.Columns) { %>  <%} %>  <% foreach(System.Data.DataRow row in Model.Rows) { %>  <% foreach (var cell in row.ItemArray) {%>  <%} %>  <%} %> 
<%=col.Caption %>
<%=cell.ToString() %>

Ahora, estoy violando una gran cantidad de principios y "mejores prácticas" de ASP.NET MVC aquí, así que comprendan que esto es solo una demostración simple. El código que crea el DataTable debe residir en algún lugar fuera del controlador, y el código en la Vista puede aislarse mejor a un asistente parcial, o html, para nombrar algunas maneras en que usted debe hacer las cosas.

Se supone que debes pasar objetos a la Vista , si se supone que la vista los presente. (La separación de las preocupaciones exige que la vista no sea responsable de crearlas ). En este caso pasé el DataTable como el modelo de vista real, pero podría haberlo puesto en la colección ViewData. Alternativamente, puede crear una clase IndexViewModel específica que contenga DataTable y otros objetos, como el mensaje de bienvenida.

¡Espero que esto ayude!

Aquí está la respuesta en la syntax de Razor

   @foreach (System.Data.DataColumn col in Model.Columns) {  }  @foreach(System.Data.DataRow row in Model.Rows) {  @foreach (var cell in row.ItemArray) {  }  } 
@col.Caption
@cell.ToString()

Mientras probé el enfoque anterior, se convierte en un desastre completo con mvc. Su controlador pasando un modelo y su vista usando un modelo muy tipado se vuelven demasiado difíciles de manejar.

Obtenga su Dataset en una lista ….. Tengo un patrón de repository y aquí hay un ejemplo de cómo obtener un conjunto de datos de un servicio web de asmx de la vieja escuela privado de solo lectura CISOnlineSRVDEV.ServiceSoapClient _ServiceSoapClient;

  public Get_Client_Repository() : this(new CISOnlineSRVDEV.ServiceSoapClient()) { } public Get_Client_Repository(CISOnlineSRVDEV.ServiceSoapClient serviceSoapClient) { _ServiceSoapClient = serviceSoapClient; } public IEnumerable GetClient(IClient client) { // **** Calling teh web service with passing in the clientId and returning a dataset DataSet dataSet = _ServiceSoapClient.get_clients(client.RbhaId, client.ClientId, client.AhcccsId, client.LastName, client.FirstName, "");//client.BirthDate.ToString()); //TODO: NEED TO FIX // USE LINQ to go through the dataset to make it easily available for the Model to display on the View page List clients = (from c in dataSet.Tables[0].AsEnumerable() select new Client() { RbhaId = c[5].ToString(), ClientId = c[2].ToString(), AhcccsId = c[6].ToString(), LastName = c[0].ToString(), // Add another field called Sex M/F c[4] FirstName = c[1].ToString(), BirthDate = c[3].ToDateTime() //extension helper ToDateTime() }).ToList(); return clients; } 

Luego en el controlador estoy haciendo esto

 IClient client = (IClient)TempData["Client"]; // Instantiate and instance of the repository var repository = new Get_Client_Repository(); // Set a model object to return the dynamic list from repository method call passing in the parameter data var model = repository.GetClient(client); // Call the View up passing in the data from the list return View(model); 

Entonces en la vista es fácil:

 @model IEnumerable @{ ViewBag.Title = "CLIENT ALL INFORMATION"; } 

CLIENT ALL INFORMATION

@foreach (var item in Model) { }
Last Name First Name Client ID DOB Gender RBHA ID AHCCCS ID
@Html.ActionLink("Select", "ClientDetails", "Cis", new { id = item.ClientId }, null) | @item.LastName @item.FirstName @item.ClientId @item.BirthDate Gender @* ADD in*@ @item.RbhaId @item.AhcccsId