2010-10-25 18 views
2

所以,我的問題是我有一個模型。我的模型具有一些基於通過url傳入並設置爲cookie的ID填充的數據,其餘爲用戶輸入,使用數據註釋進行驗證。MVC模型最佳實踐 - 如何處理非用戶輸入數據

我遇到的「問題」是如何處理這個非用戶輸入數據。是否將它放在隱藏的控件中,從而使頁面大小膨脹(儘管只是略微),還是在每個帖子後面「重新構建」模型的那部分內容,這又增加了另一次數據庫訪問並返回。

我明白這是主觀的,但我很好奇標準做法是什麼。將數據放在隱藏字段中是最簡單的方法,但即使以小塊方式廢除視圖狀態也只是爲了將其恢復,這是不對的。此外,這暴露你的數據給用戶 - 而不是他們無法調整網址。沒有人喜歡不必要的旅行到數據庫。

哦,我不能使用會話。這個應用程序運行在負載平衡的環境中。

+0

「我無法使用會話,此應用程序在負載平衡的環境中運行。」 - 這並不意味着你不能使用會話。 – jfar 2010-10-26 02:51:20

+0

如果我不需要,我不希望在分佈式環境中處理會話。:) – Josh 2010-10-26 13:21:16

回答

2

只需將該ID留在網址中即可。無論如何,url應該標識資源,因此將參數從url中取出並以任何其他方式存儲它只是做了額外的工作,並且使您的url無法識別您正在訪問的資源。

如果您有其他需要發送的數據,通常會在隱藏字段中發送標識符,像其他字段一樣驗證它。如果你能推導出信息服務器端,那麼就需要權衡重建數據的成本與更大的請求。您必須在測試過程中測量哪種應用更適合您的應用,但兩者在實踐中都很常見。但是,當你做出決定時,不要忘記安全問題,而不是所有的表現。另外,如果數據來自客戶端,不管您認爲自己隱藏多麼聰明,它仍然是用戶輸入。這意味着即使你沒有控制他們編輯屏幕上的值,一個精明的用戶也會知道如何改變它。

+0

這主要是我把數據放在隱藏字段的視圖中。即使使用防僞令牌,請求也可以「捏造」。我只使用url的問題是我的id是簡單的int值 - 很容易醫生。 – Josh 2010-10-26 13:24:57

+1

考慮到這個應用程序需要它可以獲得的所有安全性,我沒有在表單中放入任何數據。每次行動時,我都會重建模型的敏感部分。此外,我正在驗證用戶鏈接到通過QS傳入的ID,以防他們試圖偷偷摸摸。感謝您的建議。 – Josh 2010-10-27 18:30:56

1

我不認爲viewstate是要走的路,因爲它暴露內部數據到瀏覽器,它也不必要地增加您的流量。

如果我必須解決這個問題,我會去使用會話來存儲這樣的會話相關數據。如果它是一個負載平衡的環境,則需要分佈式會話處理。解決這個問題最簡單的方法就是啓動一個ASP.NET State Service並開始使用它來處理會話。

如果您不喜歡Microsoft技術,您還可以使用MemCached將會話數據存儲在memcached服務器中。有提供商爲它,例如this,不幸的是它似乎沒有在發展。

1

它會更好,如果你會從每個DAL得到它,
這不是很好的把不需要的東西,在你的HTML

想象你會得到一個用戶,並在一個隱藏的輸入把他的密碼,只是因爲你不想每次都得到它。

或者你把一些東西放在隱藏的輸入和使用螢火蟲有人改變這些輸入的值

+0

這真的是我在使用隱藏字段將數據放入視圖中的問題。改變字段非常簡單。 – Josh 2010-10-26 13:20:23

+1

@Josh你也可以加密你的id,或者你需要的任何東西,並且不要在html中放入不需要的東西 – Omu 2010-10-26 14:03:41