2011-07-29 25 views
0

我想通過從viewbag檢索爲這樣的數據的局部視圖的文件名:問題與通過非文字文本到Html.Partial()擴展方法

<div id="Zone1">@Html.Partial(ViewBag.ZoneControl1)</div> 

凡「 ViewBag的「ZoneControl1」屬性是從別處檢索的所需部分視圖的名稱(即數據庫,Web服務等)。如果我將文本作爲文字字符串,例如:

<div id="Zone1">@Html.Partial("Controls/MyPartial")</div> 

它工作得很好。如果我傳遞文本字符串從控制器ViewBag的財產,甚至只是在創造消費觀點的變量,即:

@{string zone1 = "Controls/MyPartial";} 
<div id="Zone1">@Html.Partial(zone1)</div> 

它不工作。該頁面似乎正在加載,但從不在瀏覽器中顯示任何內容。再說一遍,如果我硬編碼局部視圖名稱,但是它不能作爲變量或屬性的數據傳遞,那麼這可以正常工作。任何人都知道這是爲什麼發生?如果這是有意或無法避免的行爲,是否有解決方法?

回答

1

您不能在Html.Partial(這是什麼ViewBag)中使用動態,因爲它只接受字符串。解決此問題的快速方法是投你ViewBag.ZoneControl

@Html.Partial((string)ViewBag.ZoneControl1) 

至於第二部分(zone1 = "Controls/MyPartial")我無法複製這一點。

下面的代碼是我寫的測試它,它工作得很好。

@{ string zone1 = "Controls/MyPartial"; } 
<div>@Html.Partial(zone1)</div> 

我假設你在這種情況下真正需要查看ViewBag的答案。

+0

感謝您的回覆。實際上,我確實通過明確的強制類型轉換爲字符串(雖然我沒有在我的示例代碼中加入),但它也不起作用。如果你說「zone1」的第二個例子適合你,那麼我的代碼中必須有其他的東西。再次感謝,我會重新檢查我的代碼是否存在其他問題,然後再回來查看。 –

+0

對,對不起。我不知道它可能基於您的示例代碼。祝你好運! – Buildstarted

+0

+1,以正確分析viewbag casting問題。 –

0

嗯,我現在正在工作,我不確定是什麼修復了它。我複製了剃鬚刀代碼\標記並刪除了該視圖,並創建了一個新視圖並粘貼到舊代碼中。唯一的區別是,當我創建新的視圖,通過該向導,我指定不使用母版頁和結果頁面有代碼指定:

@{ 
    Layout = null; 
} 

原始頁面使用母版頁創建和然後我改變主意,完全拿出佈局指示。無論如何,在做出這些改變之後,它很有用!所以,我最初推測,原因是如果不使用母版頁,視圖必須指定「layout = null」。但是,然後我拿出了這個新頁面中的「layout = null」代碼,它仍然有效!所以...不知道出了什麼問題,但總結一下:

正如@BuildStarted正確指出的那樣,您可以使用ViewBag對象的屬性作爲部分視圖路徑,但您必須將其轉換爲字符串正常工作。所以,這個問題的前提是不正確的,而其他的東西正在破壞事物。只是不知道是什麼。