2

当试图遍历从控制器返回的视图中的数据时,我得到一个错误“'object'不包含'CustomerID'的定义并且没有扩展方法'CustomerID'接受'object'类型的第一个参数可以被发现”

这是我的看法

<% 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; }  
    } 
4

1 回答 1

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 指令来检查这一点。

<%@ 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) %>

    <%} %>

一切都将具有正确的类型,如果您需要在视图中放置除裸订单列表之外的任何其他内容,则可以将其放入容器中。

于 2012-11-15T16:13:46.453 回答