2009-08-30 31 views

回答

5

如果可以将其存储(序列化)到ViewData中,您可以返回任何想要的结果。关于ASP.NET MVC没有什么“魔术”限制了值和/或类型。

如果你想遍历视图中的DataTable,把它放在控制器的ViewData中,在View中检索它,并像在其他任何地方一样遍历它。

DataTable is serializable

所以类似下面的东西应该工作:

<% 
var tbl = ViewData["MyDataTable"]; 

foreach (DataRow row in tbl.Rows) 
{ 
    foreach (DataColumn col in tbl.Columns) 
    { 
    Response.Write(row[col] as string ?? string.Empty); 
    } 
} 
%> 
+6

这很适合回答他的问题,但我不建议将DataTables(或实体)传递给视图,因为它将视图与用于从数据库中获取数据的技术紧密结合在一起。在我看来,使用POCO对象更好。 – 7wp 2009-08-30 14:35:42

+1

它在MVC中不叫ViewState,它叫做ViewData。我同意Roberto的观点,您应该将包含您需要的数据的对象传递给您的视图。不要只传递一个DataTable。 – BFree 2009-08-30 15:56:28

+0

是的。在我的部分错别字。我同意罗伯托。我一直在与一个更旧的继承应用程序战斗,Viewstate在我心中。现在修复代码/评论。 – andymeadows 2009-08-30 22:27:36

2

如果我正确理解你的问题,只是因为你使用MVC,你不必使用实体框架与数据库进行通信。

在控制器内部,您可以使用任何方法从数据库中获取数据。然后,您可以将该数据转换为传递给View的自定义对象,也可以将DataTable传递给您的视图。

你的观点只是要知道如何遍历你传递给它的对象。但是,我建议使用POCO对象传递给您的视图,以便您不会将视图数据与用于从数据库中提取信息的技术紧密结合。

+0

这是什么POCO对象?简单的旧CLR对象? 好的,但我不知道如何使数据表成为POCO对象 – Josh 2009-08-30 14:49:09

+0

Hi Johsh。你是对的POCO =普通的旧CLR对象。您不需要将数据库“制作”为POCO。您可以使用任何方式来获取您的数据,如DataTable,甚至实体框架。但是在获取数据之后,您可以将其转换为您自己的POCO对象。将您的POCO对象视为数据的“载体”。然后,您的视图可以与此紧密结合,因此在不重新编码大量视图的情况下更改数据访问层并不难。 – 7wp 2009-08-30 21:26:06