也许这是完全错误的,但在WebForms时代,您会返回一个数据集,然后将其绑定到网格.但是现在在MVC中,您不应该传递DataTable,因为您不能序列化它,而且从技术上讲,它正在将对象传递到它不属于的View中.但是我到底要怎么在视图上显示数据呢?!我不能在这里使用LINQ to SQL类,因为这是纯内存数据 struct .

理想情况下,我只想拥有一个可以在视图中迭代的对象.

我真的有点不知所措,我读了the article from the "Gu"篇,我只能总结一下,我必须传回一个ViewData对象,而不是??我是不是疯了?

来自布莱蒂的欢呼

乔恩

推荐答案

这一点都不"错",只是酷家伙通常不会用MVC.顺便说一句,我希望ASP的一些早期演示.NETMVC并没有试图同时将Linq塞进Sql.它非常棒,非常适合MVC,当然,但它不是必需的.There is nothing about MVC that prevents you from using 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/模型强类型为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,所以请理解这只是一个简单的演示.创建DataTable的代码应该驻留在控制器之外的某个地方,视图中的代码最好与部分或html帮助程序隔离,这是您做事情的几种方式.

You absolutely are supposed to pass objects to the View,如果视图应该呈现它们的话.(关注点的分离决定了观点不应该对它们负责.)在本例中,我将DataTable作为实际的视图模型传递,但您也可以将其放入ViewData collection中.或者,您可以创建一个特定的IndexViewModel类,其中包含DataTable和其他对象,例如欢迎消息.

我希望这有帮助!

Asp.net相关问答推荐

AJAX返回未定义、失败

如何在 ASP.NET RadioButtonList 中的项目之间添加空格

.NET 框架 3.5 和 TLS 1.2

如何在现有数据库中创建 ASP.Net Identity 表?

asp.net、url 重写模块和 web.config

如何防止 Azure 网站进入Hibernate 状态?

是否可以在没有那些 .svn 文件夹的情况下从 subversion 签出文件?

带有 Web 套接字的 SignalR

如何从网页 (asp.net) 启动 EXE

如何从 asp:Repeater 循环遍历项目模板中的项目?

我可以创建 .config 文件并将其包含到 web.config 中吗?

无法使用单例Microsoft.AspNetCore.Hosting.Internal.HostedServiceExecutor中的范围服务MyDbContext

ASP.NET 日期时间 Select 器

如何在 ASP.NET MVC3 中配置区域

如何从 NuGet 安装 EntityFramework 5.0(和其他旧版本)?

覆盖静态方法

IIS url 重写角色,除了一些 url

在 ASPNET 标识 2.0 中禁用用户

解耦 ASP.NET MVC 5 标识以允许实现分层应用程序

ASP.NET MVC3 局部视图命名约定