当尝试遍历从控制器返回的视图中的数据时,我收到错误" '对象'不包含' CustomerID'的定义没有扩展方法' CustomerID'接受类型'对象'的第一个参数。可以找到"
这是我的观点
<% using (Html.BeginForm()) {%>
<%foreach (var item in (IEnumerable)Model)
{ %>
<%= Html.Encode(item.CustomerID) %>
<%} %>
<% } %>
这是控制器:
public ActionResult Index()
{
Models.NorthwindDataContext nw = new Models.NorthwindDataContext();
var qry = from ord in nw.Orders
join cust in nw.Customers on ord.CustomerID equals cust.CustomerID
select new Models.OrdersModel
{
CustomerID = ord.CustomerID,
OrderID = ord.OrderID,
OrderDate = ord.OrderDate.Value,
ShipCountry = ord.ShipCountry
};
var ordrs = qry.ToList();
return View(ordrs);
}
这是我的班级
public class OrdersModel
{
[Required]
[Display(Name = "OrderID")]
public int OrderID { get; set; }
[Required]
[Display(Name = "OrderDate")]
public DateTime OrderDate { get; set; }
[Required]
[Display(Name = "CustomerID")]
public string CustomerID { get; set; }
[Display(Name = "ShipCountry")]
public string ShipCountry { get; set; }
}
答案 0 :(得分:2)
<%foreach (var item in (IEnumerable<OrdersModel>)Model)
{ %>
<%= Html.Encode(item.CustomerID) %>
<%} %>
CustomerID
没有出现,因为您没有为IEnumerable
演员提供类型。
.NET尽力而为,并将每个项目视为object
,不包含CustomerID
属性。
修改强>
受Jan的评论启发,这就是我实际采用的方式。
创建一个更好的模型,其中Orders是视图模型的属性。
public class OrderListVM
{
public List<OrdersModel> Orders { get; set; }
// The benefit of using this model is you can include extra stuff here.
}
然后在你的控制器中: -
var vm = new OrderListVM { Orders = qry.ToList() };
return View(vm);
正如Jan所说,确保视图是强类型的,并准备接受OrdersListVM作为其类型。
您可以通过查看.aspx页面中的页面指令来查看此内容。
<%@ Page Title=""
Language="C#" MasterPageFile="~/Views/Shared/Site.Master"
Inherits="System.Web.Mvc.ViewPage<YourNameSpace.OrderListVM>" %>
最后,将您的标记更改为: -
<%foreach (var item in Model.Orders)
{ %>
<%= Html.Encode(item.CustomerID) %>
<%} %>
所有东西都有正确的类型,如果你需要在你的视图上放置任何其他东西,除了一个简单的订单列表,你有一个容器可以放入它。