首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

MVC5 EF6 多表聯查 View 顯示匿名型別錯誤修正

     編輯:程式設計疑難解答

錯誤現象

Controller 回傳 `OrdersDb` 為 `IQueryable<匿名型別>`,View 中 `@foreach (var l in list)` 存取 `l.a.ProductName` 報錯:'object' does not contain a definition for 'a'。

原因

匿名型別 **無法跨編譯單元 (Controller → View)** 傳遞。View 編譯時看不到匿名型別定義,只能視為 `object`。

解決方案:建立 ViewModel (DTO)

// ViewModels/OrderListItem.cs
public class OrderListItem {
    public int OrdersId { get; set; }
    public string OrdersNum { get; set; }
    public string ProductName { get; set; }
    public string Contacts { get; set; }
    public string PhoneNumber { get; set; }
    public DateTime PlaceOrdersTime { get; set; }
    // 其他需要顯示的欄位...
}

Controller 修正

var query = from o in db.Orders
            join oi in db.OrdersInfo on o.OrdersId equals oi.OrdersId
            where o.UserId == userId
            select new OrderListItem {
                OrdersId = o.OrdersId,
                OrdersNum = o.OrdersNum,
                ProductName = o.ProductName,
                Contacts = oi.Contacts,
                PhoneNumber = oi.PhoneNumber,
                PlaceOrdersTime = o.PlaceOrdersTime
            };

// 套用篩選條件...
if (!string.IsNullOrEmpty(OrdersNum))
    query = query.Where(x => x.OrdersNum.Contains(OrdersNum));
// ...

ViewBag.RestaurantOrdersList = query.OrderByDescending(x => x.PlaceOrdersTime)
                                    .ToPagedList(page, pageSize);

View 修正

@model IPagedList @* 或 IEnumerable *@
@foreach (var item in Model) {
    
        @item.ProductName
        @item.Contacts
        @item.PhoneNumber
        @item.PlaceOrdersTime.ToString("yyyy-MM-dd")
    
}

總結

**永遠不要**將匿名型別傳給 View。定義具名 ViewModel,Controller 投影成 ViewModel,View 強型別繫結,編譯期檢查、IntelliSense、重構全支援。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved