2017-04-03 212 views
0

我試圖解決錯誤'列表ActiveOrder02不包含客戶端的定義',當我將鼠標放在'.Client'上 @ Html.DisplayNameFor(model = >在下面查看model.ActiveOrders02.Client) :ASP.NET MVC查看期問題

@model MVCDemo2.ViewModels.Order02VM 

<table class="table"> 
<tr><th>@Html.DisplayNameFor(model => model.ActiveOrders02.Client)</th></tr> 

@foreach (var item in Model.ActiveOrders02) 
{ 
    <tr> 
     <td>@Html.DisplayFor(modelItem => item.Client)</td> 
    </tr> 
} 

有關的信息在這裏是控制器和視圖模型:

using MVCDemo2.Models; 
using MVCDemo2.ViewModels; 
using System.Linq; 
using System.Web.Mvc; 

namespace MVCDemo2.Controllers 
{ 
public class Order02Controller : Controller 
{ 
    private InventoryContainer db02 = new InventoryContainer(); 
    // GET: Order02 
    public ActionResult Index() 
    { 
     //Create instance of the (View)Model 
     var o = new Order02VM(); 
     //Retrieves DATA from the DB 
     var resultSet02 = db02.SampleDbTable; 
     // Push the retrieved DATA into the (View)Model 
     o.ActiveOrders02 = resultSet02.Select(x => new ActiveOrder02 
     { 
      ID = x.tableId, 
      Client = x.tableClient 
     }).ToList(); 
//EDIT caused by answer of @David 
     return View(o); 
//IT WAS:   return View(o.ActiveOrders02.ToList()); 
    } 
} 
} 

在這裏如下視圖模型:

using System.Collections.Generic; 

namespace MVCDemo2.ViewModels 
{ 
public class Order02VM 
{ 
    public List<ActiveOrder02> ActiveOrders02 { get; set; } 
} 

public class ActiveOrder02 
{ 
    public decimal ID { get; set; } 
    public string Client { get; set; } 
} 
} 

編輯:我是什麼之後,通過DisplayNameFor從SampleDbTable目前列tableClient的名稱列客戶端中的索引視圖的標題。

謝謝!

+0

想想爲什麼'model.ActiveOrders02.Client'不起作用。它在C#中不起作用,因此它在Razor中不起作用。一個'List '沒有一個名爲'Client'的屬性。 「客戶」屬性位於列表中的項目中,而不是列表本身。所以目前還不清楚你想要做什麼。如果'Client'屬性在'Order02VM'上更有意義,那麼將它移動到那裏。或者它在正確的位置定義,然後改變你如何訪問它。例如'model.ActiveOrders02.First()。Client'。 – mason

+0

感謝您的評論!, 由DisplayNameFor(model => model.ActiveOrders02.Client 我試圖通過從SampleDbTable的列的標題中獲取此列的標題以設置此列的標題。 – Angel

回答

2

因爲model.ActiveOrders02List<ActiveOrder02>類型,而不是ActiveOrder02類型。

它看起來像你只是想獲得屬性的顯示元數據,而不是特定實例的值。有一個有些直觀的方式來做到這一點:

@Html.DisplayNameFor(model => model.ActiveOrders02.First().Client) 

說明列表中使用.First()。有人可能直覺認爲這將是容易出錯的,因爲如果列表爲空,則會引發異常。 但是,ASP.NET實際上不會使用它遍歷列表。該表達式被框架用來識別框架將反映的屬性以獲取關於該屬性的元數據。

大多數的情況下,把類似的東西放在列表中將要求列表永遠不會是空的。然而,在這種特殊情況下,它應該可以正常工作。

+0

謝謝,大衛! 作爲您的建議得到的結果是以下錯誤: 傳遞到字典中的模型項目類型爲'System.Collections.Generic.List'1 [MVCDemo2.ViewModels.ActiveOrder02]',但此字典需要一個模型項目的類型'MVCDemo2.ViewModels.Order02VM'。 我還不清楚如何從SampleDbTable – Angel

+0

@Angel的相應列(tableClient)的名稱中獲取列的名稱:這是一個單獨的問題。你將視圖的模型類型聲明爲:'@model MVCDemo2.ViewModels.Order02VM',但是你傳遞它:'return View(o.ActiveOrders02.ToList());'你是否只是把它傳遞給對象本身? '返回視圖(o);'這似乎是視圖代碼所期待的。你必須給視圖一個它期望的類型的實例。因此,要麼更改控制器以提供該類型,要麼更改視圖以期望您提供的類型。 – David

+0

我的意思是返回查看(o),但嘗試不同的選項,我搞砸了,忘了糾正它。 當我改變它返回視圖(o)和在視圖'模型=> model.ActiveOrders02.First()。客戶'中使用沒有這樣的錯誤,結果是'客戶端',而我所追求的是'tableClient' 謝謝! – Angel

2

從您的代碼中可以清楚地看到ActiveOrders02是ActiveOrder02類型的對象列表。 客戶端是ActiveOrders02中元素(ActiveOrder02)中的屬性。如果你想在ActiveOrders02的第一個項目了客戶價值,你可以去

@Html.DisplayNameFor(model => model.ActiveOrders02[0].Client)

當然,你需要檢查是否ActiveOrders02爲空或不這樣做之前。

+0

您的答案對於瞭解模型 - 視圖 - 控制器世界中哪裏出錯是非常有幫助的:)我很快就會讚揚它。謝謝! – Angel

1

您指示認爲@modelMVCDemo2.ViewModels.Order02VM,但在控制器設置o.ActiveOrders02List<MVCDemo2.ViewModels.Order02VM>

o.ActiveOrders02 = resultSet02.Select(x => new ActiveOrder02 
{ 
    ID = x.tableId, 
    Client = x.tableClient 
}).ToList(); // <-- 

然後你return View(o.ActiveOrders02.ToList());,實質上調用.ToList()o.ActiveOrders02,這已經是一個List<MVCDemo2.ViewModels.Order02VM>

所以,你可以:

  • 回報Order02VM到視圖中的單個實例,而不是一個項目的列表,或...
  • 回報列表視圖,設置視圖的@modelList<MVCDemo2.ViewModels.Order02VM>並從列表中取第一個Order02VM實例(使用.First(),列表索引0等)並從那裏開始。