2011-12-16 50 views
1

這是MVC 2傳遞ViewData的MVC的用戶控件

這是我的用戶控制

Foo = <%= ViewData["Foo"] %> 

<ul id="menu" class="topTabMenu"> 
    <% foreach (X.Site s in X.AllSites) { %> 
    ... 

的一部分,這是我怎樣,我稱之爲:

<% Html.RenderPartial("MenuTabsPartial", Model, new ViewDataDictionary(new { Foo = "Bar" })); %> 

我需要做些什麼才能讓ViewData["Foo"]顯示「Bar」?有一些更好的方法可以將一些簡單的數據傳遞給這個部分嗎?

在模型中傳遞它將而不是工作,因爲我已經使用模型的東西。

編輯

手動分配此值TempData的確實工作。我應該只使用TempData嗎? ViewData只能從Controller中設置嗎?

回答

1

ViewData根據微軟的文檔,它:

獲取或設置包含數據的 控制器和視圖之間傳遞的字典。

所以,從這個定義中,我會說你說得對,只能從控制器設置ViewData。如果TempData適合你,我會使用它。如果你不怕動態,你也可以嘗試ViewBag。

編輯:忽略我對ViewBag的評論,我沒有看到你的問題被標記爲MVC2。

+0

我應該看過那些文檔。謝謝。如果我們升級到MVC3,我會遍佈ViewBag。再次感謝 – 2011-12-16 18:29:22

1

我不確定您是否可以使用匿名對象創建ViewDataDictionary。嘗試重載另一個ViewDataDictionary。這應該讓你的ViewData [「foo」]顯示「Bar」。

Html.RenderPartial("MenuTabsPartial", Model, new ViewDataDictionary(new ViewDataDictionary { { "Foo", "bar" } })); 

我已經做了一次或兩次,但我會說你真的應該考慮在模型中傳遞它。如果你的模型還不是視圖模型,那麼我會建議製作一個有兩個屬性的模型:一個代表目前是「Model」的任何一個,另一個代表「Foo」。控制器會設置它並將其傳遞給視圖。

class MyViewModel 
{ 
    public TypeOfMainModel MainModel {get; set;} //put your current model here 
    public string Foo {get; set;} 
} 

讓您的視圖使用此視圖模型。然後,當你渲染你的部分你可以通過整個模型,或者只是給它美孚(如果你的局部視圖只需要一個字符串):

Html.RenderPartial("MenuTabsPartial", Model.Foo); 

是你的選擇,但創建一個視圖模型容器包含視圖所需的所有內容,任何部分視圖都是我的首選方法。

+0

我通常會傾向於編寫一個強大的ViewModel,它具有View所需的所有功能,但這是一個遺留系統(畢竟是MVC 2),我認爲TempData是正確的路徑。 +1雖然,謝謝 – 2011-12-16 18:28:11