显示多行

时间:2013-04-01 17:58:54

标签: c# asp.net ms-access asp.net-mvc-2

我从ms访问数据库(Product table)获取数据(3个变量)并在aspx页面上显示它。我设法只显示第一行数据。似乎问题出现在foreach循环中的aspx页面代码中。我无法理解我的想法。

这是ProductController类:

    public ActionResult Index()
    {
        string str = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\Users\\vindom\\Desktop\\DB2.accdb";
        //  connection string from database Properties
        OleDbConnection con = new OleDbConnection(str);
        OleDbCommand cmd;
        OleDbDataReader reader;
        con.Open();
        {
            cmd = new OleDbCommand("SELECT * FROM product", con);
            reader = cmd.ExecuteReader();
            while(reader.Read())
                {
                ViewData["Prod_Type"] =  reader.GetValue(0);
                ViewData["Prod_N"] = reader.GetValue(1);
                ViewData["Prod_d"] = reader.GetValue(2);
                }
            con.Close();


        return View();
    }
    }

这是aspx代码:

  <table>
  <tr>
  <th>Product Type</th>
  <th>Product Number</th>
  <th>Product Details</th>
  <th></th>
  </tr>
  <%@foreach (var item  in View)
  {%>
 <tr>
 <td><%= Html.Encode(ViewData["Prod_Type"]) %></td>
 <td><%= Html.Encode(ViewData["Prod_N"]) %></td>
 <td><%= Html.Encode(ViewData["Prod_d"]) %></td>
 </tr>
 <%}%>
 </table>

..和Product.cs

namespace Tok.Models
{
    public class Product 
    {
        public string Product_Type { get; set; }
        public string Product_NUM { get; set; }
        public string Product_desc { get; set; }

        public  ICollection<Process> Processes;
    }

    public class Process
    {
        public string ProcessId { get; set; }
        public string Process_desc { get; set; }
        public string Next_processs { get; set; }

        public virtual Product Product { get; set; }
    }
}

2 个答案:

答案 0 :(得分:2)

尝试以下方法。 这将遍历您的记录集,但您在视图中的内容将无法正常工作。您需要以某种形式的集合存储行,ViewData [“Prod_XXX”]用于单个数据实例,而不是多行。

你可以建立一个这样的行列表:

List<Prod> prodRows = new List<Prod>();
while (reader.Read())
{
     prodRows.Add(new Prod 
     { 
         Prod_Type = reader.GetValue(0),
         Prod_N = reader.GetValue(1),
         Prod_d = reader.GetValue(2)
      });
 }

其中Prod是这样定义的类:

 public class Prod
 {
     public string Prod_Type { get; set; }
     public string Prod_N { get; set; }
     public string Prod_d { get; set; }
 }

然后在你的视图中你可以有这样的东西:

@model List<Prod>
@foreach(var row in Model)
{
  //Your display HTML
}

这不是一个确切的答案,但我希望它有所帮助。

答案 1 :(得分:0)

您的问题是,从外观上看,您正在执行此代码:

ViewData["Prod_Type"] =  reader.GetValue(0);
ViewData["Prod_N"] = reader.GetValue(1);
ViewData["Prod_d"] = reader.GetValue(2);

...三次,但每次都覆盖上一组值。

您似乎也没有将模型传递给您的视图。由于您想要遍历数据列表,您需要定义一个类来表示模型记录(可能是Product或类似的东西),并将您的Product记录集合传递给您的视图建了。

这样的事情(假设你有一个Product类):

List<Product> model = new List<Product>();
while(reader.Read())
{
  Product newEntry = new Product() { 
     Prod_Type = reader.GetValue(0),   // I'm ignoring the need to cast the values 
     Prod_N = reader.GetValue(1),
     Prod_d = reader.GetValue(2)
  };
  model.Add(newEntry);
}
// housekeeping
return View(model);