所以我收到错误:
“foreach语句不能对'Project.Models.Contact'类型的变量进行操作,因为'Project.Models.Contact'不包含'GetEnumerator'的公共定义”
由于某些原因。我试图尽可能简单地将我的数据库表中的数据行显示给我的应用程序。
型号:
namespace Project.Models
{
public class Contact
{
public int Id { get; set; }
public string FirstName { get; set; }
public string Lastname { get; set; }
public string Email { get; set; }
public string Phone { get; set; }
public int CompanyID { get; set; }
}
}
查看:
@model List<Project.Contact>
@{
Layout = "~/Views/Shared/_Layout.cshtml";
}
<h1>Contact</h1>
<table>
<tr>
<th>FirstName</th>
<th>LastName</th>
<th>Email</th>
<th>Phone</th>
</tr>
@foreach (var contact in Model)
{
<tr>
<td>@contact.FirstName</td>
<td>@contact.LastName</td>
<td>@contact.Email</td>
<td>@contact.Phone</td>
</tr>
}
</table>
控制器:
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Web.Mvc;
namespace Project.Controllers
{
public class HomeController : Controller
{
SqlConnection connectionString = new SqlConnection(@"Data Source=.\SQLExpress;Initial Catalog=Sublime;Integrated Security=True");
public ActionResult Index()
{
return View();
}
public ActionResult List()
{
connection.Open();
string query = "SELECT * FROM Contact";
var command = new SqlCommand(query, connection);
var dr = command.ExecuteReader();
var model = new List<Contact>();
while (dr.Read())
{
var contact = new Contact();
contact.Id = dr.GetInt32(0);
contact.FirstName = dr.GetString(1);
contact.Lastname = dr.GetString(2);
contact.Email = dr.GetString(3);
contact.Phone = dr.GetString(4);
model.Add(contact);
}
connection.Close();
return View(model);
}
}
答案 0 :(得分:1)
正如我在评论中所解释的那样,您正在将query
传递给View
方法。您应该在执行查询后传递联系人列表
因此,请确保将Contact对象列表返回给View方法。
List<Contact> model = new List<Contact>();
string query = "SELECT * FROM Contact";
using (var conn=new SqlConnection("Put Your conn string here"))
{
using (var cmd = new SqlCommand(query,conn))
{
conn.Open();
using (var rdr = cmd.ExecuteReader())
{
if (rdr.HasRows)
{
while (rdr.Read())
{
var m = new Contact();
m.FirstName = rdr.GetString(rdr.GetOrdinal("FirstName"));
//map other properties here as well
model.Add(m);
}
}
}
}
}
return View(model);
由于您要向视图发送联系人对象列表(并循环浏览它们,您应该将您的视图强烈输入到联系人列表
@model List<Project.Contact>
<h1>Contact</h1>
<table>
<tr>
<th>FirstName</th>
<th>LastName</th>
<th>Email</th>
<th>Phone</th>
</tr>
@foreach (var contact in Model)
{
<tr>
<td>@contact.FirstName</td>
<td>@contact.LastName</td>
<td>@contact.Email</td>
<td>@contact.Phone</td>
</tr>
}
</table>
答案 1 :(得分:0)
问题是你永远不会将模型传回视图。您在控制器代码中创建一个var模型,但是您需要将其传递给您具有View(查询)的视图,您还需要将sql查询中的项目实际读取到您创建的联系模型列表中。它应该看起来像这样。
List<Contact> model = new List<Contact>();
while(rdr.read())
{
Contact c = new Contact();
//bind items to "c" here
model.add(c);
}
return view(model);
然后在您的视图中,如果您将模型绑定更改为此
,则可以显示上面列出的模型@model List<Contact>
答案 2 :(得分:0)
您可能忽略了框架的重点。 ASP.NET MVC不是为查询数据库而构建的,而是将结果集转换为可显示的网页而不进行其他处理,但它旨在与代码集成,使工作更轻松。
执行
后执行此操作rdr = cmd.ExecuteReader();
您需要添加读取阅读器内容并将该数据移动到模型的代码。像
这样的东西while (rdr.Read())
{
Contact contact = new Contact {
FirstName = reader["FirstName"].ToString(),
...
};
model.Add(contact)
}
然后,将填充的模型发送到视图,您可以在该视图中实际在正在构建的视图上写入数据。