2012-02-24 165 views
3

我知道this question,但原始海報接受了一個不涉及嵌套的解決方案。我肯定希望嵌套部分視圖(當然,除非有更好的方法)。是否可以嵌套部分視圖?

我有一個頁面,可以根據用戶在主視圖中的操作,加載幾個部分視圖之一。 (這些視圖是部分的,因爲我的理解是,如果你想從Ajax調用中加載重要的附加內容,則需要從調用中返回一個PartialViewResult。)幾個部分視圖有一個公共元素,一個下拉列表,喜歡把它分解成它自己的部分觀點。

但這不起作用。我的部分視圖都有一個關聯的視圖模型,這是他們的模型。對於嵌套的局部視圖,我想從父視圖的視圖模型中傳遞一個單個字段的值,一個可爲空的int,作爲嵌套局部視圖的模型。

但是在運行時,我收到一個錯誤消息,說我的局部視圖需要一個可爲空的對象,但是接收到了X,其中X是與父局部視圖關聯的視圖模型的類型。

所以我的問題是雙重的:

  1. 是築巢的部分景色根本不允許? (在這種情況下,我希望框架將檢查情況並拋出一個錯誤,如此明確說)。

  2. 有沒有辦法讓我想要的效果,一個分解出來的通用界面元素,其他比部分觀點?我已經考慮過,但沒有嘗試過創建編輯模板,因爲我相信對部分視圖不起作用的東西對於這些不起作用,但我可能是錯的。

ETA:我發現我的問題:當你通過對模型中的空值到HtmlHelper.Partial或的RenderPartial,渲染引擎subsitutes的地方,空的呼喚局部視圖模型,假設你根本沒有通過一個模型。

在我的情況下,這不是真的:我的可空Nulllable < int>是可空的,因爲在設置之前它是空的! null在語義上是有意義的!

但這就是我遇到問題的原因。

+1

爲了響應您的編輯:您必須將null轉換爲可空int,例如'(int?)null' – dotjoe 2012-02-24 22:28:54

+0

@dotjoe這會有一個不同的效果比傳遞一個模型屬性或類型爲int的變量嗎?那恰好有一個空值?因爲那正是我所做的。我會認爲,如果一個空投給int?會工作,一個已經是int類型的變量?會工作。但事實並非如此。 – 2012-02-25 00:05:24

+0

是的,這也應該工作......它不會比我的答案...怪異。 – dotjoe 2012-02-25 14:30:02

回答

3

是的,你可以嵌套部分視圖。只要確保你通過了正確的模型。 HtmlHelpers在這裏很有用,因爲你可以用完整的視圖路徑封裝對RenderPartial的調用,並確保使用正確的模型。

例如

public static void RenderSomePartial(this HtmlHelper helper, int? i) 
{ 
    helper.RenderPartial("~/Views/Shared/SomePartial.cshtml", i); 
} 
+0

謝謝!這幫助我找出了我的問題! – 2012-02-24 21:15:37

1

是的,可以。如果你需要傳遞模型,它可能會有點混亂。如果您使用強類型模型,請嘗試使用DisplayTemplates或EditorTemplates而不是部分。

+0

謝謝;這是一個很好的建議。 – 2012-02-24 21:16:01

0

您可以使用呈現在你的父視圖部分和調用一些子視圖 你也可以通過與視圖袋 數據,當你調用從父的局部視圖從控制器到父視圖通過數據可以傳遞到子視圖 我使用視圖包發送我的數據到子視圖

+0

謝謝;這很有幫助。 – 2012-02-24 21:16:23