簡體   English   中英

強類型的ASP.NET MVC ViewData擴展 - 放置標識符的位置?

[英]Strongly typed ASP.NET MVC ViewData extensions - where to put identifiers?

有時,創建新模型類型的開銷很煩人。 在這些情況下,我想設置ViewData,選項似乎是:

  1. 只需使用字符串鍵設置viewdata,然后將其拋出即可。 這有明顯的問題。

  2. 將標識符(字符串鍵)存儲在某處(控制器上的?)並將其強制轉換為視圖頁面。 在解決其中一個問題時,我仍在施法,這是有問題的,並且會殺死類型推斷。

  3. 使用MVCContrib強類型的Set / Get函數。 有時這些很好,但如果類型不是很具描述性,比如布爾“IsNew”,它們就不能很好地工作。 它也會殺死類型推斷,它仍然只是在進行轉換,所以我必須手動同步視圖和控制器。

所以,我正在考慮使用幻像類型來組合類型和密鑰標識符。 它等同於這個psuedo-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,一些常見的類可以正常工作。 但對於View / Controller特定數據? 將它放在控制器上是否有任何缺點? (除了控制器的長名稱?)

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

我認為這就是模型在MVC模式中的作用。 為什么不使用打字視圖呢?

我相信你只是通過在控制器和視圖之間引入另一個依賴項來使事情變得更復雜。 我沒有看到代碼行或類似的任何特定好處。 您必須聲明變量的存在,您還要在模型類定義中執行該變量。

這樣做不會帶來任何重大優勢。

在您不想創建特定視圖模型類的情況下,一種想法是為強類型視圖創建元組:

class SimpleModel<T>

class SimpleModel<T, U>

class SimpleModel<T, U, V>

然后像往常一樣制作強類型視圖。 現在您擁有強大的打字優勢,而無需為每個案例創建一個新類。

.NET 4.0內置了Tuple等。

我仍然使用ViewData字典,而不是“把它扔掉”我只是使用ToString()和Html.Encode它。 為什么打破MVC模式?

我剛剛張貼了一個涵蓋這個主題的帖子。

http://agilefutures.com/index.php/2009/06/mvc-strongly-typed-global-viewdata

希望它有用。

問候

托比

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM