在MVC中显示标准数据表

也许这是完全错误的,但在Webforms的日子里,你会返回一个数据集,然后绑定到一个网格。 但是现在在MVC中,你不应该传递一个数据表,因为你不能序列化它,它在技术上将对象传递到它不属于的View中。 但是我究竟想要在视图上显示数据呢? 我不能在这里使用LINQ to SQL类,因为这是一个纯内存数据结构。

理想情况下,我只想能够有一个对象,我可以在视图中迭代。

我真的有点不知所措,我已经阅读了“顾”的文章 ,我只能总结一下,我必须传回一个ViewData对象,而不是? 我疯了吗?

Blighty的欢呼声

乔恩

这根本就不是“错误的”,这不是MVC中那些很酷的家伙的做法。 顺便说一句,我希望ASP.NET MVC的早期演示不会同时在Linq-to-Sql中填充。 这非常棒,非常适合MVC,当然,但这不是必需的。 没有关于MVC,阻止您使用ADO.NET 。 例如:

控制器操作:

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 } 

查看:( w /强制types为System.Data.DataTable的模型)

 <table border="1"> <thead> <tr> <%foreach (System.Data.DataColumn col in Model.Columns) { %> <th><%=col.Caption %></th> <%} %> </tr> </thead> <tbody> <% foreach(System.Data.DataRow row in Model.Rows) { %> <tr> <% foreach (var cell in row.ItemArray) {%> <td><%=cell.ToString() %></td> <%} %> </tr> <%} %> </tbody> </table> 

现在,我在这里违反了ASP.NET MVC的许多原则和“最佳实践”,所以请理解这仅仅是一个简单的演示。 创buildDataTable的代码应该位于控制器之外的某个位置,并且View中的代码可能更好地与部分或者html帮助器隔离,以此来说明您应该做的一些事情。

你绝对应该把对象传递给视图 ,如果视图应该呈现它们。 (关注的分离决定了视图不应该负责创build它们)。在这种情况下,我将DataTable作为实际视图模型传递,但是您也可以将其放入ViewData集合中。 或者,您可以创build包含DataTable和其他对象(如欢迎消息)的特定IndexViewModel类。

我希望这有帮助!

这里是Razor语法的答案

  <table border="1" cellpadding="5"> <thead> <tr> @foreach (System.Data.DataColumn col in Model.Columns) { <th>@col.Caption</th> } </tr> </thead> <tbody> @foreach(System.Data.DataRow row in Model.Rows) { <tr> @foreach (var cell in row.ItemArray) { <td>@cell.ToString()</td> } </tr> } </tbody> </table> 

当我尝试上面的方法时,它与mvc成为一个完整的灾难。 您的控制器使用强types模型传递模型和视图变得太难以应付。

获取你的数据集到列表…..我有一个存储库模式,这里是一个从旧学校获取数据集的例子asmx web服务专用只读CISOnlineSRVDEV.ServiceSoapClient _ServiceSoapClient;

  public Get_Client_Repository() : this(new CISOnlineSRVDEV.ServiceSoapClient()) { } public Get_Client_Repository(CISOnlineSRVDEV.ServiceSoapClient serviceSoapClient) { _ServiceSoapClient = serviceSoapClient; } public IEnumerable<IClient> 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<IClient> 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<IClient>(); return clients; } 

然后在控制器中,我正在这样做

 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); 

然后在视图中很容易:

 @model IEnumerable<CISOnlineMVC.DAL.IClient> @{ ViewBag.Title = "CLIENT ALL INFORMATION"; } <h2>CLIENT ALL INFORMATION</h2> <table> <tr> <th></th> <th>Last Name</th> <th>First Name</th> <th>Client ID</th> <th>DOB</th> <th>Gender</th> <th>RBHA ID</th> <th>AHCCCS ID</th> </tr> @foreach (var item in Model) { <tr> <td> @Html.ActionLink("Select", "ClientDetails", "Cis", new { id = item.ClientId }, null) | </td> <td> @item.LastName </td> <td> @item.FirstName </td> <td> @item.ClientId </td> <td> @item.BirthDate </td> <td> Gender @* ADD in*@ </td> <td> @item.RbhaId </td> <td> @item.AhcccsId </td> </tr> } </table>