2013-07-25 37 views
3

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

不要将'DataReader'或'DataTable'传递给视图。不要将'DataReader'或'DataTable'传递给ViewModel。创建一个代表需要使用的数据的POCO - 这称为模型,将它传递给知道如何将该数据按摩为可呈现的类的类 - 这称为ViewModel,然后将其传递到View中。为了让您的生活更轻松地尝试[实体框架](http://msdn.microsoft.com/zh-cn/data/ef.aspx)。 – Jay

+0

我真的试图避免EF和使用我自己的DAL类型的类。我正在传递一个数据表和它的视图。但我会修改你的建议给班级,然后看看是否需要更少的代码。感谢提示 – Ammad

回答

5

MVC中的视图始终与一个强类型的模型,即关联在case..just一个class..so创建一个类与list..while获取数据插入数据到一个列表,并通过该类到视图..

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

很抱歉的代码格式。 ..从手机发布

+0

-1表示格式不正确。 – shuniar

+0

它是否是代码?cuz我刚刚从我的手机上乘坐公交车时发布了代码 –

+0

对我来说,没有它可以,它很好地了解如何去做。感谢您发布它的不错和有益的。 – Ammad

4

没有传递DataReader到视图 - 它转换到一个断开连接的对象/模型。

如果您正在使用剃刀,将它添加到您的.cshtml页面顶部告诉它会发生什么类型的模型:

@model System.Data.DataTable 
+0

恩,这会工作,当然,但它仍然丑陋和不好的做法。 – EkoostikMartin

+0

谢谢Cam,我使用Datatable及其工作。 – Ammad

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.Accept在视图中的数据表

@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
**Copy paste as it is to your view**  

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

    <h2>Report</h2> 

    <table> 
     <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> 
+0

请解释你的解决方案。不只是转储一段代码。 –

4

用于控制器:

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