2011-06-01 53 views
0

所以我在viewdata語句中打包了一些查詢結果。在foreach語句中解包viewdata

我可以確認結果的正確數量被放入可視數據對象在視圖中使用此指令:

@foreach (var action in (List<LemonadeTrader.Models.Message>)ViewData["messages"]) { 

當我嘗試以顯示結果:

@Html.DisplayFor((LemonTrader.Models.Message)action.msg) // action.msg should be of type string 

它說,它無法將字符串轉換爲LemonTrader.Models.Lemon。

當我投它爲:

@Html.DisplayFor((string)action.acidity) 

它說:

The type arguments for method 'System.Web.Mvc.Html.DisplayExtensions.DisplayFor(System.Web.Mvc.‌ ​HtmlHelper, System.Linq.Expressions.Expression>)' cannot be inferred from the usage. Try specifying the type arguments explicitly.

不投它在所有也不行。

我該如何施放結果?

回答

0

這工作:

@foreach (var action in (List<LemonTrader.Models.Message>)ViewData["lemons"]) { 
    <tr> 
     <td> 
      @Html.Encode(action.acidity) 
0

我認爲這只是一個語法錯誤,因爲DisplayFor需要一個Func來獲取您的模型作爲輸入。 試試這個:@Html.DisplayFor(m => (string)action.acidity)

+0

我收到此錯誤:「模板只能與字段訪問,屬性訪問,單維數組索引或單參數自定義索引器表達式一起使用。」 – micahhoover 2011-06-01 18:19:53

1

DisplayFor/EditorFor使用強類型視圖和查看模型。它將第一個參數作爲lambda表達式,它表示您試圖顯示/編輯的視圖模型的屬性。所以把這個ViewData放入垃圾箱(這是它所屬的地方),並使用視圖模型和強類型視圖。

因此,而不是下面的恐怖:

@foreach (var action in (List<LemonadeTrader.Models.Message>)ViewData["messages"]) { 

你必須正確類型的消息屬性視圖模型:

@foreach (var action in Model.Messages) { 

甚至更​​好(爲什麼寫foreach循環時dislpay /編輯器模板已經這樣做):

@Html.DisplayFor(x => x.Messages) 

T他的你的方式得到很多獎金:

  • 您的代碼將工作
  • 您獲得智能
  • 沒有較脆魔的字符串,而不是象一些意大利麪條代碼
  • 您的看法變得更加可讀
  • ...
+0

感謝您的建議。我無法找到多個模型返回到視圖的任何好模型示例。它看起來像你只能返回一個視圖。這裏的解釋有助於解釋使用強類型模型的動機,這是我以前從未見過的。謝謝! – micahhoover 2011-06-01 16:57:12

+0

@micahhoover,的確,您只能將一個模型返回到視圖。所以你定義了一個可以包含其他類型屬性的視圖模型,這樣你就可以將任何你喜歡的模型傳遞給視圖。 – 2011-06-01 17:59:41