2014-04-10 34 views
1

我們假設我有三個類:Derived1ViewModel,Derived2ViewModelBaseViewModel,它用作Derived1ViewModelDerived2ViewModel的超類。MVC Html.DisplayFor衍生模型列表

我有具有作爲List<BaseViewModel>模型的DisplayTemplate,我想打電話從使用作爲List<Derived1ViewModel>List< Derived2ViewModel>一個模型視圖此模板。

如果我試圖做到這一點,一個異常被觸發說,它不能轉換List<Derived1ViewModel>List<Derived2VIewModel>List<BaseViewModel>.如果我嘗試應用如@Html.DisplayFor(model=>model.Cast<BaseViewModel>.ToList(), "MyTemplate"),則會引發InvalidOperationException鑄造。

詳細說明: [InvalidOperationException異常:模板只能與現場訪問,屬性訪問,一維數組的索引,或者單參數定製索引表達式中使用]

能這個問題被解決或它的必要採取另一種方法?

回答

0

問題解決了通過使用模板BaseViewModel,而不是List<BaseViewModel>。通過這種方式,我可以將任何派生類型傳遞給模板(例如:Derived1ViewModel,Derived2ViewModel)。

實施例:

@*Derived1 View*@ 
@model List<Derived1ViewModel> 
@for(var i = 0; i < Model.Count; i++) 
{ 
    int i1 = i; 
    @Html.DisplayFor(model=>model[i1], "MyTemplate") 
} 

@*Derived2 View*@ 
@model List<Derived2ViewModel> 
@for(var i = 0; i < Model.Count; i++) 
{ 
    int i1 = i; 
    @Html.DisplayFor(model=>model[i1], "MyTemplate") 
} 

@*Template*@ 
@model BaseViewModel 
<p>It works @Model.Name</p> 
0

請注意,在@Html.DisplayFor(model=>model, "MyTemplate")第一個參數不是型號。這是一個Expression將在模型評估。

該模型隱式傳遞給MVC表達式編譯器(我認爲使用ViewData),並且該模型的類型仍然是您在Razor頁面開始處聲明的內容。它與表達沒有任何關係。表達式僅指示型號作爲起始參數需要哪些數據。

話說回來,這給了一槍:

@Html.DisplayFor(model=>model.Select(dm=>(BaseViewModel)dm).ToList(), "MyTemplate") 

雖然我有,你會打的MVC表達式計算抽絲,它只能處理一組特定表達的感覺。 (常數表達,會員訪問等)

我們可以根據您的結果來做到這一點。

+1

它仍然觸發一個InvalidOperationException。 [InvalidOperationException:模板只能與字段訪問,屬性訪問,單維數組索引或單參數自定義索引器表達式一起使用。] – IsKernel

0

如果模型IEnumerble < SomeModel的子類>

MVC將呈現爲SomeModel,

首先,你不能投名單<一個>這麼任一列表<乙>直接

轉換爲列表<B>在視圖中並使用Display(而不是DisplayFor)或從列表中更改顯示模板的模型類型<A>到IEnumerable的<一個>

其次,你必須UIHintAttribute設置模板名稱或把它作爲參數來DisplayFor

+0

您可以詳細說明並給出示例嗎?爲什麼使用Html.Display而不是Html.DisplayFor? – IsKernel

+0

對不起,用我的手機打字 正如我記得Html.Display(m => m.MyProperty.Cast <BaseViewModel>().ToList(),「MyTemplate」)不是一個有效的語法。 所以你必須使用 var newModel = Model.MyProperty.Cast <BaseViewModel>().ToList(); Html.Display(newModel,並向 「MyTemplate的」) 類似的東西 –

+0

或從列表變更DisplayTemplate的模型到的IEnumerable @model IEnumerable的 @ { VAR模型=模型.ToList(); } –