2011-07-25 54 views
19

我有一個編輯器模板,並且在該編輯器模板中,我想調用具有相同模型(即嵌套)的另一個編輯器模板,但似乎沒有顯示。
即。 \ EditorTemplates \ Template1.cshtml在編輯器模板中使用相同的模型調用另一個編輯器模板

@model foo 

// insert code here to edit the default fields. 

// display extra fields via another editor template. 
@Html.EditorForModel("Template2") // or @Html.EditorFor(m => m, "Template2") 

和\ EditorTemplates \ Template2.cshtml

@model foo 

@Html.TextBoxFor(m => m.Name) 

我相信有人會質疑,爲什麼?那麼,只有滿足條件纔會顯示嵌套模板(即。@if(@ Model.IsConditionMet){....}),但爲了簡單起見,我已將其保留在原型之外。

+0

我試圖做類似的事情,但無濟於事。自從你寫這個以來有什麼運氣? – kdawg

+0

其實,後續信息:我正在嘗試與Telerik的MVC網格控件一起執行此操作。這也可能與它有關。 – kdawg

+0

@kdawg - 不,不好意思。我已經轉向了JQuery模板和Knockoutjs。 – tkerwood

回答

41

簡短的回答:

使用Html.Partial代替。

所以,在你Template1.cshtml文件:

@model foo 

// insert code here to edit the default fields. 

// display extra fields via another editor template. 
@Html.Partial("EditorTemplates/Template2", Model) 

龍答:

這可悲的似乎是特意設計的。 MVC會跟蹤已渲染的模型,並且如果模型已經被模板渲染,即使模板不同,它也不會執行兩次。因此,爲什麼第二個@Html.EditorForModel("Template2")什麼都不做。

具體來說,它是在ViewData.TemplateInfo.VisitedObjects這是一個內部字段跟蹤,所以你沒有希望在事後修改它。這個字段的意圖是防止無限遞歸。貴族,但惱人的是,它不考慮使用的模板。

我通過查看源代碼發現了這一點:http://aspnetwebstack.codeplex.com/, 這非常適合尋找MVC的這些奇怪的特性。

+2

非常有幫助的答案,感謝您的研究! –

+1

這應該被標記爲答案。堅強的工作。 – akousmata

+0

這是一個恥辱,我們不能投票標記爲答案。感謝您的研究。 – Ravendarksky