2009-04-17 83 views
1

將自定義屬性添加到側面ViewDataDictionary的最實用方法是什麼?CustomViewData的最佳途徑?

讓我們假設一個簡單的例子:

public ActionResult Index() 
{ 
    // ViewData["Title"] = "Home"; 
    ViewData.Title = "Home"; 
    return View(); 
} 

,想到的第一件事是在應用基礎控制器的自定義類,並使用「新」:

public class CustomDataDictionary : ViewDataDictionary 
{ 
    public string Title { get; set; } 
} 

public class ApplicationController : Controller 
{ 
    public new CustomDataDictionary ViewData { get; set;} 
} 

我假設您還必須使用相同的屬性創建相應的CustomViewPage以在視圖中使用自定義視圖數據字典。

想到的第二件事是創建一個ViewDataDictionaryExtensions類。

第三,使用「查看模型」。 View Model的牛肉總是創建一個,然後將它傳遞給View,好像在控制器代碼中一遍又一遍地重複自己,至少與之前的兩個選項相比。

真正的目標是每個應用程序可能有一組核心的ViewData的有意義的所有應用目的性的。我傾向於迴避依賴字典密鑰,並且最好讓其他開發人員擁有真正的屬性來依靠它來知道要設置的數據。另外,鑰匙很容易被拼錯。

以上三種方法都可以完成工作。別人做了什麼?

回答

0

最後,至少對於這個應用程序,我有一個基礎的AppViewModel類。 Controller.OnActionExecute/ed查看ViewData.Model的設置,如果不是,則將AppViewModel的一個實例放在它的位置,以便所有頁面都有一個一致的Model來處理(Model.Title,Model.IsAuthenticated,Model 。用戶等)

隨後更詳細的控制器動作有AppModelView的子類,被設置爲ViewData的。在動作本身中手動建模,或者通過屬性在OnExecute/ed中設置。

根本不是非常多的代碼,但它不會在所有控制器操作中重複相同的舊創建/設置代碼。對我而言,它將視圖數據保存爲一個包,而不是混淆Controller api。 「

0

重新命名拼寫錯誤的問題 - 這是常數的問題。

對於ViewData進行適當的類型,你需要繼承等;所以在你做完這些之後,我想知道你是否能夠輕鬆地將一些通用代碼添加到設置密鑰的控制器中。

對我來說,至少對於我來說,最簡單的答案似乎也適用於最廣泛的情況(即某些代碼只知道基本的IDictionary<string,object>)。

您還可能有興趣在this related question

+0

」這就是常數。「 聽起來不錯,直到你有大約50人。當你開始使用常量作爲散列鍵名時,它會變得非常快。 擴展將是gret ...如果只有我們有擴展屬性。獲取/設置ala SmartBag不會告訴不熟悉的編碼人員對解決問題的很多瞭解。 控制器方法可以,但你暗示他們是控制器的屬性,這是不正確的。他們是action viewdata的屬性。 – claco 2009-04-17 15:24:05

0

所有這些聽起來像他們會工作。我想你選擇哪一個取決於你的需求。 (真正獨特和翔實的答案,對吧?)

你的問題是「什麼都做了別人?」雖然。因此,如果您正在輪詢,最近已經使用常量方法來處理較小的應用程序。我還沒有完成企業MVC應用程序,但我想我可能會創建一個繼承Controller的基類,並定義這些額外的屬性。如果我想將這些一致地傳遞給視圖,我將同樣爲我的模型創建一個基類。然而,這將不得不謹慎使用 - 即使你正式輸入它們,它們仍然像全局變量一樣。所以你當然要小心。