2013-07-25 2 views
3

Я новичок в MVC и пытаюсь написать простое приложение MVC 3, которое считывает данные клиента внутри класса в модели и возвращает его для просмотра с помощью контроллера. Читатель показывает, что он имеет строки, но при загрузке в таблицу и переходе на просмотр в качестве модели он равен нулю. Мне нужно простое решение пройти либо 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, а затем передает это в ваш вид. Чтобы облегчить вашу жизнь, попробуйте [Entity Framework] (http://msdn.microsoft.com/en-us/data/ef.aspx). – Jay

+0

Я действительно пытался избежать EF и использовать свои собственные классы типа DAL. Я передаю данные и их работу на виду. Но я изменю свое предложение на класс, а затем посмотрю, требуется ли его меньше кода. Спасибо за подсказку – Ammad

ответ

5

Вид в MVC всегда связано с сильно типизированных модели Т.е. class..so в вашем case..just создать класс с 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

Это код? .. Потому что я только что разместил код во время поездки в автобусе с моего мобильного телефона. –

+0

Нет, это нормально для меня, его хорошо понять, как это сделать.Спасибо, что разместили его в приятной и полезной. – Ammad

4

Не передать DataReader в вид - превратить его в отключенный объекте/модель первым.

Если вы используете бритву, добавьте в верхней части страницы .cshtml сказать ему, какой тип модели ожидать:

@model System.Data.DataTable 
+0

Умм, это сработает, конечно, но его еще уродливая и плохая практика. – EkoostikMartin

+0

Спасибо Cam, я использую Datatable и его работу. – Ammad

3

1.Pass datatable в представлении.

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 в DataTable в представлении

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

Попробуйте :) (у)

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> 
Смежные вопросы