2

コントローラから返されたビューのデータをループしようとすると、「オブジェクト」に「CustomerID」の定義が含まれておらず、「object」タイプの最初の引数を受け入れる拡張メソッド「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; }  
    } 
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 に答える