2013-04-18 35 views
0

的這個問題我已經記錄hereherehereespecially here其中,在ASP.NET MVC4認爲,HTML輔助功能@Html.HiddenFor(m => m.ID)將使用「錯誤」的數據,並會導致數據損壞。防止使用MVC的HiddenFor功能

這是一個巨大的問題,接受的「解決方案」是簡單地意識到這一點,並圍繞它設計。我認爲這是一個糟糕的解決方案。 (順便說一句,我們使用這樣的代替:<input type="hidden" value="@Model.ID" />

每隔幾個月,我或一位同事忘記和使用該html幫手,並且在我們再次追查問題之前,所有地獄崩潰。

如何消除此功能的使用,避免將來出現錯誤?
- 這不是我們的代碼,所以我們不能[Obsolete]
標記它 - 我們可以覆蓋HtmlHelper,但是這是一個大量的工作只是爲了消除一個功能
- 我可以寫一個單元測試來挑選出這些代碼從看法?(如果檢測到該呼叫,則失敗測試)
- 其他想法?

+1

你想要一個代碼分析工具如FxCop的,並提出將運行作爲構建過程的一部分的規則。我懷疑有沒有辦法在編譯中做到這一點,如屬性。 –

回答

3

這不是一個「問題」,它是應該的工作方式。這不僅僅是隱藏的,每個幫手都會這樣做。這正是MVC設計工作的方式。你似乎並不瞭解MVC如何工作的事實是真正的問題。

這是ModelState子系統的一部分,您明智地知道它是如何工作的。是的,這並不總是直觀的,但是事實上你知道事情的工作要比假裝他們不存在要好得多,因爲你最終會以其他助手的身份以其他方式被咬傷。

但是,如果你選擇,否則,我會建議配置了StyleCop處理這個問題

+0

我們知道MVC是如何設計工作的,正如其他人指出的那樣,這很不直觀,很容易導致數據損壞。對於一個新的團隊成員來說,他可以很容易地炸燬我們的系統。問題在於我們使用的工具設計不佳。所以我們需要解決它們。 –

+0

Stylecop是一個有趣的想法。 –

+0

@BobbyB - 但正如我所說,這個問題影響* ALL *助手,而不僅僅是隱藏,所以我沒有看到你通過禁止Hidden獲得了什麼。 –

1

如果你想要一些靜態分析工具,你我的外表上CodeContracts也可通過 Visual Studio Gallery +還有其他工具(納了,就像我所知道的)。

的主要思想是:你通過在代碼中的屬性條件將定義和條件通過調用相關聯的方法驗證二進制代之前,或在運行時。 但考慮到您不允許或不能更改使用該功能的代碼,可能是

Roslyn會更適合您。所以你可以調查你的AST並找出是否有一些不需要的函數調用。

注:取決於架構它可以成爲相當複雜的問題,但是,這些都是你可以考慮IMO選項的方式。

0

我不知道這是否會幫助,但我做了什麼,除去我的代碼HiddenFors是實現一種ViewState。該模型被序列化到客戶端,我的模型綁定器被設置爲反序列化這個。我把代碼放在https://github.com/willseitz/ModelViewState。這可能有助於您提出一個通用解決方案。

0

Erik是對的,它應該在做HTTP POST時工作。這是一個很好的解釋:Blog link。博客提出了幾種解決方案,包括你的Bobby B :-)

來自博客的引用: 「ASP.NET MVC假定如果您要渲染視圖以響應HTTP POST,並且您正在使用Html Helpers,那麼你很可能會重新顯示驗證失敗的表單,因此,Html Helpers實際上會在ModelState中檢查在字段中顯示的值,然後再查看Model,這樣可以重新顯示錯誤的數據如果需要,輸入一個匹配的錯誤信息。 ... Html Helpers(即Html.Hidden和Html.TextBox)首先檢查ModelState ...並顯示動作接收的值,而不是我們修改的值。 「

感謝nemesv和里斯·斯蒂芬斯(stackoverflow link