2009-01-23 47 views
1

有時,創建新模型類型的開銷很麻煩。在這種情況下,我想設置的ViewData,並且選項似乎是:強類型的ASP.NET MVC ViewData擴展 - 在哪裏放置標識符?

  1. 與字符串鍵簡單地設置可視數據,丟了出來。這有明顯的問題。

  2. 將標識符(字符串鍵)存儲在某處(控制器上的?),並將其轉出到查看頁面上。在解決其中一個問題的同時,我仍在進行投射,這是有問題的,並且會導致類型推斷。

  3. 使用MVCContrib強類型設置/獲取函數。這些很好,但如果類型不是很具描述性,比如說一個布爾型的「IsNew」,那麼它們工作得並不好。它也殺死了類型推斷,並且它幾乎只是在進行強制類型轉換,所以我必須手動同步視圖和控制器。

所以,相反,我正在考慮使用幻像類型來結合類型和密鑰標識符。它會相當於這個僞C#:

class ViewDataKey<T> = string 

這將讓我在控制器這樣創建的標識符:

public static readonly ViewDataKey<bool> IsNew = "IsNew"; 

通過一些簡單的擴展方法,設置數據將是:

ViewData.Set(IsNew, true); 

得到它也很容易:

var isNew = ViewData.Get(FrobNozzleController.IsNew); 

注意我們不需要指定isNew的類型,它是安全的推斷。密鑰和類型定義存儲在一個位置。

問題:

  1. 應該在哪裏密鑰存儲?對於「global-ish」ViewData,一些普通的類可以正常工作。但對於視圖/控制器的具體數據?把它放在控制器上有什麼缺點嗎? (除了控制器的長名稱?)

  2. 有沒有更簡單的方法或已經內置的東西?

回答

2

我認爲這是模型在MVC模式中所做的。爲什麼你不使用類型化的視圖呢?

我相信你只是通過在控制器和視圖之間引入另一個依賴關係來使事情更加複雜。我從代碼或類似的東西中看不到任何具體的好處。你必須聲明變量的存在,你也可以在模型類定義中做這個變量。

這樣做你沒有得到任何顯着的優勢。

+0

你是對的,當然。只是有時候,在這裏和那裏添加簡單的標誌似乎是額外的工作。也許他們甚至是可選的(ViewDataKey可以很容易地存儲默認值)。只是爲每個視圖創建一個新的模型似乎是一個很大的開銷。 – MichaelGG 2009-01-23 19:31:57

2

一個想法是創建在的情況下一個強類型的視圖元組,你不希望創建一個特定的視圖模型類:

class SimpleModel<T> 

class SimpleModel<T, U> 

class SimpleModel<T, U, V> 

然後做一個強類型的視圖,一如往常。現在您擁有強大的打字功能,無需爲每種情況製作新課程。

.NET 4.0有元組等,內置的。

+0

元組可以用於一些非常簡單的事情,但假設你有「IsNew」,「ShowFrobNozzleSelector」等等 - 所有布爾值... – MichaelGG 2009-01-23 19:32:42

0

我仍然使用ViewData字典,和而不是「鑄造出來」我剛纔用的ToString()和它了Html.Encode 。爲什麼要打破MVC模式?

相關問題