0

ms access データベース (製品テーブル) からフェッチし、aspx ページに表示するデータ (3 つの変数) があります。データの最初の行のみを表示することができました。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);

... 3 回、ただしそのたびに以前の値のセットを上書きします。

また、ビューにモデルを渡していないようです。データのリストを繰り返し処理する必要があるため、モデル レコードを表すクラスを定義し (おそらく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 に答える