Controller 回傳 `OrdersDb` 為 `IQueryable<匿名型別>`,View 中 `@foreach (var l in list)` 存取 `l.a.ProductName` 報錯:'object' does not contain a definition for 'a'。
匿名型別 **無法跨編譯單元 (Controller → View)** 傳遞。View 編譯時看不到匿名型別定義,只能視為 `object`。
// 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; }
// 其他需要顯示的欄位...
}
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);
@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、重構全支援。