2016-08-09 50 views
1

根據微軟的documention,我應該能夠在調用@ Html.DisplayFor時將匿名類型的對象作爲additionalViewData傳遞;然而,當我這樣做,我收到了黃屏指出:當使用DisplayExtensions.DisplayFor方法時無法將匿名對象作爲additionalViewData傳遞

The model item passed into the dictionary is of type 'System.Collections.Generic.List'1[Surveys2.Models.ReportingSidebarItemViewModel]', but this dictionary requires a model item of type 'Surveys2.Models.ReportingSidebarItemViewModel'.

這裏是我的部分觀點:

@model Surveys2.Models.ReportingPageViewModel 
@Html.DisplayFor(m => m.Pages, "ReportingSidebarItemViewModel", new { PageType = Model.PageType }) 

這裏是我的控制器操作:

public ActionResult Summary(string projectCode) 
{ 
ReportingPageViewModel reportingPageViewModel = GetReportingPageViewModel(new ReportingPageParams { ProjectCode = projectCode }); 
return View("Page", reportingPageViewModel); 
} 
+0

誤差言自明,你而視圖需要單個對象作爲傳遞列表它是強類型到單個對象 –

+0

但是,當我使用只有一個參數調用時,我沒有收到錯誤:@ Html.DisplayFor(m => m.Pages),即使第一個參數對於兩個重載都是相同的。 –

+0

您能否顯示您的視圖的頂部和您的控制器操作代碼? –

回答

1

問題這裏是通過使用DisplayFor的第二個參數來定位顯示頁面。當您在沒有目標視圖的情況下調用displayfor(m => m.prop)時,ViewEngineCollection會查找最適合的diplay頁面。如果最適合的顯示頁面僅適用於單個項目,並且您通過了一個列表,它將會爲您迭代。目標顯示器假定您傳遞的是您定位的頁面的確切類型,並因此中斷。

EDIT--有趣的是MSDN文檔不談論除了在DisplayFor循環(M => m.prop)方法

+0

如果我正確理解你,那麼@ Html.DisplayFor(m => m.Questions)和@ Html.DisplayFor(m => m.Pages,「ReportingSidebarItemViewModel」,new {PageType = Model.PageType})都會中斷DisplayFor方法,那麼爲什麼只有在Razor對第一個DisplayFor沒有任何問題的情況下,兩者中的後者纔會中斷? –

+0

No DisplayFor(m => m.prop)使用運行時引擎找出最合適的視圖,並在需要時執行foreach以使其工作。但是,當您按名稱定位視圖時,它會直接發送屬性。儘管我會承認MSDN的文檔沒有區別。這是我以前在處理DisplayFor –

+0

時的經驗。當我將其更改爲@ Html.DisplayFor(m => m.Pages,new {PageType = Model.PageType})並省略了templateName時,我獲得了期望的結果。 –

相關問題