问题循环从ASP.NET MVC控制器返回的数据

时间:2012-11-15 16:07:12

标签: c# asp.net-mvc

当尝试遍历从控制器返回的视图中的数据时,我收到错误" '对象'不包含' 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; }  
    } 

1 个答案:

答案 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) %>

    <%} %>

所有东西都有正确的类型,如果你需要在你的视图上放置任何其他东西,除了一个简单的订单列表,你有一个容器可以放入它。