【问题标题】:How can I pass DataReader/DataTable to view?如何通过 DataReader/DataTable 进行查看?
【发布时间】:2013-07-25 21:47:53
【问题描述】:

我是 MVC 的新手,正在尝试编写一个简单的 MVC 3 应用程序,该应用程序读取模型类中的客户数据并使用控制器将其返回给视图。阅读器显示它有行,但是当加载到表并作为模型传递给视图时,它为空。我需要一个简单的解决方案来传递DataTable 以查看或传递DataReader 以查看我可以转换为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);
        }
    }
}

【问题讨论】:

  • 不要将DataReaderDataTable 传递给视图。也不要将 DataReaderDataTable 传递给 ViewModel。创建一个 POCO 来表示您需要使用的数据 - 这称为模型,将其传递给知道如何将数据按摩成可呈现的东西的类 - 这称为 ViewModel,然后将其传递到您的视图中。为了让您的生活更轻松,请尝试Entity Framework
  • 我真的试图避免使用 EF 并使用我自己的 DAL 类型类。我正在传递一个数据表及其工作视图。但是我会修改你对一个类的建议,然后看看它是否需要更少的代码。感谢提示

标签: c# asp.net asp.net-mvc asp.net-mvc-3


【解决方案1】:

对于控制器:

 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>

【讨论】:

  • 如果我想将此视图中的数据表发送回控制器以供另一个视图使用,我该怎么做?
【解决方案2】:

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>
}

对不起,代码格式...从手机发布

【讨论】:

  • 是代码吗?..因为我刚刚在乘公共汽车旅行时通过手机发布了代码
  • 不,对我来说没问题,很高兴知道如何去做。感谢您发布它,它很好而且很有帮助。
  • @suryaDeepak 格式修复后,我将删除 -1。
  • 因为我的电脑坏了..你能帮我格式化一下吗..:)
  • 这个人是通过移动设备完成的。不要做个混蛋
【解决方案3】:

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

如果您使用的是 Razor,请将其添加到您的 .cshtml 页面的顶部,以告知它预期的模型类型:

@model  System.Data.DataTable

【讨论】:

  • 嗯,这当然可以,但它仍然是丑陋和糟糕的做法。
【解决方案4】:

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)

【讨论】:

    【解决方案5】:

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

    @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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-26
      • 1970-01-01
      相关资源
      最近更新 更多