0

我有数据(3 个变量)要从 ms 访问数据库(产品表)中获取并将其显示在 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; }
    }
}
4

2 回答 2

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
}

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

于 2013-04-01T18:18:32.607 回答
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);
于 2013-04-01T18:22:33.730 回答