如何将DataReader / DataTable传递给视图?

4
我是MVC的新手,尝试编写一个简单的MVC 3应用程序,该应用程序在模型中读取客户数据并使用控制器将其返回到视图。阅读器显示它有行,但当加载到表格并作为模型传递给视图时,它为空。我需要一个简单的解决方案,可以将DataTableDataReader传递到视图,在那里我可以将其转换为DataTable
以下是代码:
namespace MvcApplication3.Models
{
    public class Customer
    {
        public DataTable GetCustomers(OdbcDataReader rds)
        {
            String ConString = "DSN=Northwind;Uid=;Pwd=;";
            String SQL = "SELECT * FROM CUSTOMERS";
            DataTable tbl = new DataTable();

            using (OdbcConnection con = new OdbcConnection(ConString))
            {
                con.Open();
                OdbcCommand cmd = new OdbcCommand(SQL, con);
                rds = cmd.ExecuteReader();
            }
        }

    }
}

namespace MvcApplication3.Controllers
{
    public class DefaultController : Controller
    {
        //
        // GET: /Default1/

        public ActionResult Index()
        {
            Customer cs = new Customer();
            OdbcDataReader rd = new OdbcDataReader();
            cs.GetCustomers(rd);

            DataTable tb = new DataTable();
            tb.Load(rd);
            return View(tb);
        }
    }
}

1
不要将 DataReaderDataTable 传递给视图。也不要将 DataReaderDataTable 传递给 ViewModel。创建一个代表您需要处理的数据的 POCO - 这称为模型,将其传递给知道如何将该数据转换为可呈现内容的类 - 这称为 ViewModel,然后将其传递到您的视图中。为了使您的生活更轻松,请尝试使用 Entity Framework - Jay
我真的很想避免使用EF,而是使用自己的DAL类型类。我正在传递一个数据表并在视图上工作。但我会根据您的建议进行修改,然后看看是否需要更少的代码。谢谢提示。 - Builder
5个回答

8

对于控制器:

 public ActionResult Index()
        {
            DataTable dt = GetData();

            return View(dt);
        }

在视图中:

@model System.Data.DataTable
@using System.Data;

.................. .............. ........

 <table class="table table-hover">
                        <thead>
                            <tr>
                                @foreach (DataColumn col in Model.Columns)
                                {
                                    <th>@col.ColumnName</th>
                                }
                            </tr>
                        </thead>
                        <tbody>
                            @foreach (DataRow row in Model.Rows)
                            {
                                <tr>
                                    @foreach (DataColumn col in Model.Columns)
                                    {
                                        <td>@row[col.ColumnName]</td>
                                    }
                                </tr>
                            }
                        </tbody>
                    </table>

如果我想将这个数据表从这个视图发送回控制器,以便由另一个视图使用,我该怎么做? - Matthew Zourelias

6

MVC中的视图总是与一个强类型的模型(即类)相关联。因此,在您的情况下,只需创建一个带有列表的类。在获取数据时,将该数据插入到列表中,并将该类传递到视图中。

class A {
    public string name{get;set;}
    public int age{get;set;}
}

//code when fetching data
//this list should be in the class where you fetch the data
Public list<A> list=new list<A>();
while(datareader.read)
{
    A Aobj=new A();
    String name=reader['name'].tostring();
    int age =Convert.ToInt(reader['age']);
    A.name=name;
    A.age=age;
    list.add(A);
}//end of while loop

//action resut
public ViewResult yourview(){
    Return View(list);
}

//now you can access the data from the view.              
By....
@model IEnumerable<A>
//here A is your class name
@foreach(var data in Model){
    <div>@data.age</div>
}

抱歉,代码格式可能有些问题...这是从手机上发布的


2
是代码的问题吗?因为我刚刚在公交车上用手机发布了代码。 - Surya Deepak
不,对我来说没问题,了解如何做很好。谢谢你的发布,很好很有帮助。 - Builder
@suryaDeepak 一旦格式修正完成,我将删除-1。 - shuniar
由于我的电脑坏了,你能帮我格式化一下吗?:) - Surya Deepak
在MVC中,模型并不总是与强类型类相关联。强类型类是您并非总能获得或拥有的奢侈品。 - Deathstalker
1
这个人是用移动设备完成的。不要做一个傻瓜。 - Matt

4

不要将 DataReader 直接传递到视图中,先将其转换为断开连接的对象/模型。

如果您正在使用 Razor,请在 .cshtml 页面顶部添加以下内容,以告诉它要期望哪种类型的模型:

@model  System.Data.DataTable

嗯,这样做可以运行,但仍然很丑陋,是不好的实践。 - EkoostikMartin

3

1. 将数据表传入视图。

 public ActionResult my()
    {
        con.Open();
        SqlCommand cmd = new SqlCommand("select * from table",con);
        SqlDataAdapter da = new SqlDataAdapter(cmd);
        DataTable dt = new DataTable();
        da.Fill(dt);
        return View(dt);

    }

2. 在视图中接受数据表

@model System.Data.DataTable


<!DOCTYPE html>
<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>my</title>
</head>

<body>
    <div> 
       No of rows= @Model.Rows.Count
    </div>
</body>
</html>

试一下吧 :) (y)


0

将此复制粘贴到您的视图中,然后根据索引显示您想要显示的预期详细信息;

@using System.Data;
@model DataTable

<h2>Report</h2>

<table>
    <thead>
        <tr>

                <th>@Model.ColumnName[1]</th>

        </tr>
    </thead>
    <tbody>
        @foreach (DataRow row in Model.Rows)
        {
            <tr>

                    <td>@row[1]</td>

            </tr>
        }
    </tbody>
</table>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接