2009-10-13 25 views
4

在ASP.NET MVC Views中使用代碼隱藏被認爲是不好的做法嗎?今天與我的同事們就此進行了一場辯論,我想知道社區的想法。在ASP.NET MVC Views中使用代碼隱藏

顯然,當使用另一個MVC如Rails時,這不是一個選項,這讓我覺得它更像是一個用於習慣使用傳統ASP.NET Web窗體應用程序的柺杖。

+2

人們傾向於懶惰(即使學習)。每個開發者都會遵循格言:「讓懶惰的混蛋離開你的身體」。從一開始就這樣做。避免將Web表單與mvc混合。 – 2009-10-13 21:40:26

回答

6

我在第一個ASP.NET MVC(Preview 3!)項目中廣泛使用了代碼隱藏 - 主要用於將ViewData [「foo」]轉換爲強類型數據對象,將視圖數據收集到IEnumerables中,所以我可以穿過它,那種事情。隨着強類型視圖的引入,以及(可怕地命名的)Model-View-ViewModel模式的實際使用,我從來沒有錯過代碼隱藏,因爲它剛剛從項目框架中移除最終版本。

現在我強烈地感受到,無論處理您在您的視圖的正在做的代碼隱藏,你好得多造型結果在您的視圖模型的處理的,允許控制器執行實際的處理,並保持該視圖儘可能簡單輕便。這可以讓你測試處理邏輯,它使得視圖更容易修改,並創建 - 我認爲 - 將數據轉換爲顯示並實際顯示它們之間更加優雅的分離。

5

是的代碼隱藏一直是商業邏輯的祕密藏身之地,我們都知道它不應該在視圖層面。

背後的代碼已被刪除,以阻止頑皮的開發者被誘惑。

8

當然,ASP.NET MVC In Action的作者提出反對,我同意。這不是必要的,那爲什麼呢?在早期的測試版中包含了一個代碼隱藏文件,但是在RTM(或之前)刪除了這個文件。

通常情況下,它只是鼓勵您在視圖中做更多的非視圖工作,因爲它在視線之外。

11

我想說,在ASP.NET MVC中使用代碼隱藏是一種不好的做法。 MVC允許將表示邏輯(在視圖中)與應用程序邏輯(在控制器中)分離的關注點分離。使用代碼隱藏將在代碼隱藏內部混合表示邏輯和應用程序邏輯,從而消除MVC的一些好處。

+6

我還沒有發現任何我無法用jQuery和Controller Action調用完成的任何事情 - 這意味着我還沒有找到在我參與過的幾個中等規模的ASP.NET MVC項目背後的代碼。 – CmdrTallen 2009-10-13 20:13:30

+1

您希望在模型中使用您的應用程序邏輯。控制器只能用於連接視圖和模型數據。 – 2009-10-15 17:44:22

2

我建議不惜一切代價避免MVC應用程序中的代碼隱藏。使用後面的代碼會否定使用MVC框架獲得的某些值,例如關注點分離等。您希望在模型中應用數據訪問,業務規則,類型轉換和類型轉換。如果你發現你需要像Dylan提到的那樣轉換你的數據類型,你可能需要製作ViewModels。 ViewModel基本上就是你希望顯示的實際模型的數據,並以你希望顯示的格式顯示。

2

當使用MVC時,最好避免在代碼中放置任何東西。
我有興趣瞭解哪個部分正在進行辯論,在代碼隱藏方面呢?

如果你是新來的Asp.Net MVC,我真的建議花一些時間去體驗Nerd晚餐的例子。這裏有一個免費的電子書和來源http://nerddinner.codeplex.com/

從頭開始創建簡單演示是一種很好的學習方式。
做完這些之後,它可能會對代碼隱藏的代碼的位置有所瞭解。

注:如果你遵循電子書,抓住從CodePlex上的最新site.css文件,否則虛擬地球地圖將無法正確對齊。

HTH
拉爾夫

0

應當指出的是,「代碼背後」是Web窗體的功能視圖引擎。它確實與ASP.NET MVC本身無關。

例如,MVC3中的Razor視圖引擎甚至不支持它。

我會以這種方式回答你的問題:如果你不能在不重寫控制器(甚至是你的模型)的情況下切換視圖引擎,那麼你沒有正確使用MVC模式。

可能大部分你在.aspx.cs文件中做的事情應該在模型(或視圖模型)傳遞給視圖之前完成。也就是說,在我從ASP.NET Web Forms遷移到ASP.NET MVC的項目中,我留下了很多代碼隱藏的地方。例如,我發現使用Repeater控件比嘗試在Web窗體中使用'for'循環更清爽,更令人愉快。畢竟,我仍然只是遍歷View Model數據。那爲什麼不呢?問題的分離得到保留(實際上可能更大程度上)。

我的意思是,爲什麼Web窗體的「最佳實踐」突然成爲Web窗體視圖的錯誤方式?作爲一個簡單的例子,考慮一個Repeater,它爲表的每一行分配一個不同的CSS類。爲什麼我的控制器(或者甚至是我的模型)在意?試圖將這種邏輯嵌入到Web窗體中,很快就會變成標籤湯和完成意大利麪條。現在想象一些更復雜的東西

我已經離開了母版頁,在後面的代碼中建立菜單。同樣,所有數據都來自視圖模型。我不明白爲什麼以這種方式使用GridView或其他控件應該是一個問題。

我通常在Web窗體中禁用了ViewState,並在「Init」中做了數據綁定。不過,通常會有一個我無法擺脫的小型ViewState。我在「渲染」中放置了一些代碼,將它移動到表單之後(默認爲之前)。當轉移到MVC時,我有時會留下這個代碼。所以,我有ASP.MVC網站確實使用代碼隱藏。我只是小心,它代碼是特定於視圖。

在新項目上,我發現在大多數頁面上對代碼隱藏的需求較少。值得慶幸的是,像Razor這樣的視圖引擎已經使得混合代碼和標記在線的寫入,閱讀和維護的痛苦減輕了很多。