2013-07-25 80 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>