C# 显示多行
我有数据(3个变量)要从ms access数据库(产品表)中获取并显示在aspx页面上。我只显示了第一行数据。似乎问题出在foreach循环中的aspx页面代码中。我就是不能清醒过来 以下是ProductController类:C# 显示多行,c#,asp.net,ms-access,asp.net-mvc-2,C#,Asp.net,Ms Access,Asp.net Mvc 2,我有数据(3个变量)要从ms access数据库(产品表)中获取并显示在aspx页面上。我只显示了第一行数据。似乎问题出在foreach循环中的aspx页面代码中。我就是不能清醒过来 以下是ProductController类: public ActionResult Index() { string str = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\Users\\vindom\\Desktop\\D
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; }
}
}
namespace Tok.Models
{
公共类产品
{
公共字符串乘积_类型{get;set;}
公共字符串乘积_NUM{get;set;}
公共字符串乘积_desc{get;set;}
公共信息收集过程;
}
公共类过程
{
公共字符串ProcessId{get;set;}
公共字符串进程_desc{get;set;}
公共字符串Next_processs{get;set;}
公共虚拟产品产品{get;set;}
}
}
试试下面的方法。
这将遍历您的记录集,但视图中的内容将不起作用。您需要将行存储在某种形式的集合中,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)
});
}
@model List<Prod>
@foreach(var row in Model)
{
//Your display HTML
}
那么在你看来,你可以有这样的东西:
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)
});
}
@model List<Prod>
@foreach(var row in Model)
{
//Your display HTML
}
@型号列表
@foreach(模型中的var行)
{
//您的显示HTML
}
这不是一个确切的答案,但我希望它能有所帮助。您的问题是,从外观上看,您正在执行以下代码:
ViewData["Prod_Type"] = reader.GetValue(0);
ViewData["Prod_N"] = reader.GetValue(1);
ViewData["Prod_d"] = reader.GetValue(2);
。。。三次,但每次都覆盖上一组值
您似乎也没有向视图传递模型。由于您希望遍历数据列表,因此需要定义一个类来表示模型记录(可能是Product
或类似的内容),并将已生成的Product
记录的集合传递给视图
类似这样(假设您有一个产品
类):
列表模型=新列表();
while(reader.Read())
{
Product newEntry=新产品(){
Prod_Type=reader.GetValue(0),//我忽略了强制转换值的需要
Prod_N=reader.GetValue(1),
Prod\u d=reader.GetValue(2)
};
model.Add(newEntry);
}
//内务管理
返回视图(模型);
我认为reader.MoveNext()将导致跳过一行,因为reader.Read()
将读取下一行。很好地发现,Ann-我上次使用ADO是在大约10年前使用VB6的时候,而你过去习惯于(!reader.EOF){//do stuff reader.MoveNext()}。此时,你跳过行是因为和
和.MoveNext()
。请删除.MoveNext()
,因为在这个答案中它是100%不必要的。除此之外,这是正确的答案。这样做,你至少会多投一票。谢谢@Joshua,我用你的建议更新了我的答案。是的,我有一个产品类。。对不起,我应该提到。。。这里:我在aspx页面行中遇到错误。。。。它说服务器块的格式不好为什么要使用语法符号?与MVC 3相比,我对MVC 2不太熟悉,但我认为你不会需要它。嗯……如果我不使用它们,它会在网页上打印出每个语句。。。我是第一次和mvc打交道,所以我想说我对这两种语言都不太熟悉……)mvc 2是使用Razor语法,还是使用旧语法(不知道它的名字),我编辑了你的标题。请参阅“”,其中的共识是“不,他们不应该”。