2012-10-15 57 views
2

這裏是我的模型:顯示列表

public class ViewInvoice 
{ 
    public string ClientLocation { get; set; } 
    public List<DetailsGroup> Details { get; set; } 

    public class DetailsGroup 
    { 
     public List<string> Product { get; set; } 
     public List<string> ProductSize { get; set; } 
     public List<string> PackageType { get; set; } 
     public List<DateTime> OrderDate { get; set; } 
     public List<DateTime> DeliveryDate { get; set; } 
     public List<int> OrderNumber { get; set; } 
     public List<decimal> Price { get; set; } 
     public List<int> ItemQuantity { get; set; } 
    } 
} 

我想我的Razor視圖中顯示在表中這種模式。下面是該代碼:

@using MyModel.MyTools.Orders.SumOrder 
@model SumOrder 

@{ 
    ViewBag.Title = "View Invoice"; 
} 

<h2>View Invoice</h2> 

<table> 
    @foreach(var prod in Model.OCI) 
    { 
     <tr> 
      <td> 
       @prod.ClientLocation 
      </td> 
     </tr> 
     foreach (var orderItem in prod.Details) 
     { 
      <tr> 
       <td> 
        @orderItem.Product 
       </td> 
       <td> 
        @orderItem.ItemQuantity 
       </td> 
      </tr> 
     } 
    } 
</table> 

在正確的表格顯示的第一行,這是一個城市的名字,但其下一行我得到這個:

System.Collections.Generic.List 1[System.String] System.Collections.Generic.List 1 [System.Int32]

有人可以向我解釋爲什麼我無法獲得以可讀格式返回的列表,以及如何解決此問題?

下面是我對小組使用的列表中ViewInvoice型號代碼:

// group the cartItems according to location 
     List<ViewInvoice> ordersGrouped = cartItems.GroupBy(c => new 
      {c.ClientLocation}) 
      .OrderBy(c => c.Key.ClientLocation).Select(s => 
       new ViewInvoice() 
        { 
         ClientLocation = s.Key.ClientLocation, 
         Details = new List<ViewInvoice.DetailsGroup>() 
          { 
           new ViewInvoice.DetailsGroup() 
            { 
             Product = s.Select(p => p.Product).ToList(), 
             ItemQuantity = s.Select(p => p.ItemQuantity).ToList(), 
             DeliveryDate = s.Select(p => p.DeliveryDate).ToList(), 
             OrderDate = s.Select(p => p.OrderDate).ToList(), 
             OrderNumber = s.Select(p => p.OrderNumber).ToList(), 
             PackageType = s.Select(p => p.PackageType).ToList(), 
             Price = s.Select(p => p.Price).ToList(), 
             ProductSize = s.Select(p => p.ProductSize).ToList() 
            } 

          } 

        }).ToList(); 
+0

你的問題不清楚。你能告訴我們控制器嗎?鑑於Model.OCI是ViewInvoice的列表,這應該很好。請向我們展示完整的錯誤。 – Ammar

回答

2

好吧,我終於解決了我的問題。我最初過度考慮了這個問題。我簡化了模型,並在我的視圖中添加了一些簡單的邏輯。

這裏是更新的型號:

public class ViewInvoice 
{ 
    public string ClientLocation { get; set; } 
    public List<string> Product { get; set; } 
    public List<string> ProductSize { get; set; } 
    public List<string> PackageType { get; set; } 
    public List<DateTime> OrderDate { get; set; } 
    public List<DateTime> DeliveryDate { get; set; } 
    public List<int> OrderNumber { get; set; } 
    public List<decimal> Price { get; set; } 
    public List<int> ItemQuantity { get; set; } 
} 

用於組的列表中模型更新的代碼:

// group the cartItems according to location 
     List<ViewInvoice> ordersGrouped = cartItems.GroupBy(c => new 
      {c.ClientLocation}) 
      .OrderBy(c => c.Key.ClientLocation).Select(s => 
       new ViewInvoice() 
        { 
         ClientLocation = s.Key.ClientLocation, 
         Product = s.Select(p => p.Product).ToList(), 
         ItemQuantity = s.Select(p => p.ItemQuantity).ToList(), 
         DeliveryDate = s.Select(p => p.DeliveryDate).ToList(), 
         OrderDate = s.Select(p => p.OrderDate).ToList(), 
         OrderNumber = s.Select(p => p.OrderNumber).ToList(), 
         PackageType = s.Select(p => p.PackageType).ToList(), 
         Price = s.Select(p => p.Price).ToList(), 
         ProductSize = s.Select(p => p.ProductSize).ToList() 

        }).ToList(); 

和更新後的視圖:

@using MyModel.MyTools.Orders.SumOrder 
@model SumOrder 

@{ 
    ViewBag.Title = "View Invoice"; 
} 

<h2>View Invoice</h2> 
@{ 
    int i = 0; 
} 
<table> 
    @foreach(var mod in Model.OCI) 
    { 
     var modCount = @mod.Product.Count(); 
     <tr> 
      <th>@mod.ClientLocation</th> 
     </tr> 
     <tr> 
      <th>Product</th> 
      <th>Price</th> 
     </tr> 
     foreach (var items in mod.Product) 
     { 
      <tr> 
       <td> 
        @mod.Product.ElementAtOrDefault(i) 
       </td> 
       <td> 
        @mod.Price.ElementAtOrDefault(i) 
       </td> 
      </tr> 
      i++; 
     } 

    } 
</table>  

將該溶液清楚地允許我遍歷沿途再現任何需要的行或單元的模型。過去兩天在這個問題上玩過俄羅斯輪盤賭。希望這爲其他人面臨這個問題節省了一些時間。

0

因爲字符串列表是不一樣的字符串。 您所看到的是List類的ToString()方法返回的內容,默認值。

要想從列表中的元素以逗號分隔顯示使用:

string.Join(",", orderItem.Product.ToArray()) 
string.Join(",", orderItem.ItemQuantity.ToArray()) 

每當你要打印的東西,對象的ToString()方法將被調用。 在列表<>類上定義的ToString()方法無法知道如何顯示數據,查看列表可以如何包含多個String或int或Date。例如,您可能希望在每個值前添加一個<p>,在每個值後面添加</p >。

第一行顯示正確,因爲ClientLocation是一個簡單的類型。 有關簡單類型的更多信息,請參見simple types

+0

感謝您的協助和解釋。 – user1206480

1

您的模型對象沒有任何意義。爲什麼你的每個物業如價格和數量都是一個集合?單個訂單訂單項對象對於每個屬性只有一個值,而不是集合。您的發票對象已經佔多個Details對象,但是一個細節對象不應該將其屬性列爲列表。從所有屬性中刪除列表<>,它應該解決它。

+0

是的,它對我來說也沒有任何意義,哈哈。我想弄清楚如何正確表示我使用linq分組的列表。我將添加上面的linq代碼。 – user1206480

+0

您仍然沒有解釋爲什麼您的Details對象將它的每個屬性都作爲一個集合而不是單個值。對我來說,它似乎不應該是列表 – macsux

+0

嗯,我最初嘗試這種方式,但我似乎沒有訪問我認爲的屬性。在示例中,我不能再在prod.Details中寫入** var orderItem **這是我第一次試圖在視圖中顯示分組列表,所以我確信我只是缺少一些簡單的邏輯。我只是不知道它是什麼。 – user1206480