2010-02-09 40 views
51

我只是在尋找轉換WebForms爲MVC:asp.net c#MVC:如何在沒有ViewState的情況下生活?

在.net MVC中,什麼概念使ViewState的東西不需要?

如果一個表單被髮回iteself等(即回發)? page/usercontrol如何保持其狀態?

人們在維護某種狀態而不訴諸會話狀態方面做了些什麼?

當然,一個完全無狀態的環境是不存在的?

+0

我確實認識到web是無狀態的,我的意思是與asp.net webforms相比... – 2010-02-09 19:59:58

回答

78

但當然可以。實際上,web 是無狀態的。事實上,任何相反的想法都是畸變。

Web控件在MVC中消失了。在服務器端沒有事件觸發。這被兩種不同的機制取代 - 網址和發佈表單數據。正確使用這些將取代您對ViewState的需求。

在傳統的ASP.NET Web應用程序中,您可以在您的網頁上放置一個可執行函數X的LinkBut​​ton。ASP.NET會將大量ViewState cruft,javascript和其他內容粘貼到網頁中,以便當用戶點擊按鈕並「返回」到網站(通過提交一個沒有人知道的表單),ASP.NET重建發生的事情並確定一個特定的按鈕事件處理程序必須被執行。

在MVC中,您將構建鏈接以訪問特定路線。該路線描述了用戶希望做什麼 -/Users/Delinquent/Index(顯示所有違規用戶的列表)。 MVC中的路由系統確定哪個Controller將處理該路由以及該控制器上的哪個方法將執行。任何附加信息都可以通過URL查詢字符串值傳遞給控制器​​方法(對於第5頁的違規操作,?頁面= 5)。

除了URL之外,還可以使用HTML表單將POST更復雜的信息(例如表單的數據值)或不適合查詢字符串(如文件)的內容。

所以你通過查詢字符串「維護」狀態並形成POST值。事實上,你會發現最終沒有太多的狀態要維護。事實上,不得不保持很多狀態很好地表明你的設計缺乏,或者你正在嘗試做一些不適合網站模型的事情。

+11

非常同意 - 這是沒有必要的,而且,在事實上,沒有它就容易多了。 – Paddy 2010-02-09 16:25:50

+7

你的網站越少,編碼,測試和維護越簡單。問題在於,國家是一個如此巨大的柺杖,起初它很難擺脫它。 – Will 2010-02-09 16:26:46

+8

+1爲無狀態視圖層爲好設計。無狀態的觀點被大大誤解。 – 2010-02-09 16:46:01

0

狀態是數據庫中的模型。您可以小心地緩存數據庫以減少頁面加載時間。

9

viewstate只是一個大的,醜陋的隱藏表單字段。

寫出你自己的隱藏表單域,並在必要時加密它們。

幸運的是,現在已經不再有簡單的方法來將大量和大量數據轉儲到頁面中,因此您必須對要保存的內容進行審慎。

+6

encrypted?它沒有默認加密。你的意思是編碼。您可以輕鬆解碼視圖狀態。 – Steven 2010-02-09 16:36:00

+0

@steven你是對的,它並不總是加密:http://msdn.microsoft.com/en-us/library/aa479501.aspx – 2010-02-09 16:40:35

+0

Html.Serialize() – 2013-12-20 10:53:00

0

自動生成視圖狀態並不在MVC存在,但你可以編寫自己的簡單的使用隱藏域,

在MVC中,你不會看到很多加密字符的上,你不要」頁面頂部大多數人需要。

4

如果一張表格被髮回本身等 (即回發)? page/usercontrol如何保持其狀態?人們爲維持某種狀態而採取什麼樣的手段而不訴諸會話狀態?

發佈的ViewData(或綁定到頁面的強類型對象)可以再次推送到視圖。請參閱this page.中的「使用模型類集成驗證和業務規則邏輯」它顯示瞭如何發佈表單,驗證表單並在發生錯誤時將表單返回給表單。

在.NET MVC,什麼概念,使 ViewState的東西那不是必需的 ?

Representational State Transfer (REST).

12

一些相關的問題:


在最傳統的網絡語言概念有狀態的環境實際上是非常罕見的。 ASP.NET Webforms是規則的一個例外,它通過重新創建許多標準來創建該例外。 Webforms背後的目標主要是抽象概括HTML和Web開發的概念,以便桌面應用程序和Web應用程序之間的界限從開發角度模糊。這通常意味着ASP.NET Webforms提供的解決方案雖然有效,卻是一種千斤頂式的交易實現,它會產生一些非常詳細的輸出,足以滿足大多數人的需求。相反,ASP.NET MVC的核心優勢在於它將HTML輸出控制權交還給開發人員,並允許他們創建強大架構的Web應用程序,這些Web應用程序在實現和呈現時定義得更好,更清晰 - 儘管犧牲了某些級別的方便。

Webforms模型最大的缺點之一就是ViewState,因爲它會使輸出混亂,在某些場景中顯着增加頁面大小,而且通常相當於使用手提鑽掛圖片。與其試圖在MVC應用程序中使用ViewState(或任何與之類似的應用程序),您應該開始使用明確控制表單中字段的模式,並僅使用最相關的數據來優化輸入和輸出操作。除了標記的變化之外,您還將學習如何構建更好的設計解決方案,以便在您的應用程序和外部環境中使用。

我想做的第一個比較就是:Webforms構建Web頁面,但MVC構建Web應用程序。如果您的日常工作主要是構建網站的各個部分,或者添加小塊功能,您通常會發現Webforms更容易,更省時;另一方面,如果你想構建一個可測試,可擴展且靈活的完整應用程序,那麼MVC就是你的調用。

0

其實它確實如此。你必須忘記視圖狀態的持久性。

您還需要將您的想法回發轉換到頁面以「調用控制器」。這種方式事後會更容易理解。不是調用頁面,而是調用返回視圖的控制器。因此,無論是在每次通話中一次又一次地構建您的整個「頁面」,還是您決定只處理受該行爲影響的內容。如果按鈕正在更改div,爲什麼要重新加載整個頁面。只要讓你打電話給你的控制器,並返回你的div中應該是什麼新數據。

例如,讓我們設想一個主/詳細情形:

<h2>Groups</h2> 
    <div id="GroupList"> 
    </div> 
    <div id="GroupDetail" title="Detail Group"> 
</div> 

組名單在div加載一次,有 爲組的列表的每個項的AJAX調用可以將控制器:

<%= Ajax.ActionLink("Edit", "DetailLocalisationGroup", 
        new { id = group.Id }, 
        new AjaxOptions() { 
         UpdateTargetId = "DetailLocalisationGroup", 
         OnSuccess = "InitialisationDetailGroup" })%> 

它調用這個動作DetailLocalisationGroup這是飼料div的GroupDetail與HTML。

[AcceptVerbs("POST")] 
public ActionResult DetailLocalisationGroup(int id) 
{ 
    LocalisationGroup group = servicelocalisation.GetLocalisationGroup(id); 
    return View("DetailGroup", group); 
} 

現在有在div形式,推動這種形式的提交按鈕的時候,我們只是給我們真的需要一個控制器,這將然後保存在數據庫中的數據信息。

在所有這些事件中,組列表中瀰漫着這是顯示在客戶機屏幕上的東西,但需要有沒有互動等何苦自己與這些一視圖狀態...

+0

嗨,好吧,我正在通過一些教程,並認爲我掌握你在說什麼......但是不知道如何你可以列出的東西沒有在UI上的模板佈局設計,你必須硬編碼一些控制器中的Html模板?那看起來似乎並不是一個問題? – 2010-02-10 09:35:34

+0

..或我錯過了什麼... – 2010-02-10 09:35:51

+0

希望它不是太晚...嗯,你不需要控制器中的Html模板。您唯一需要的是說出要使用哪個視圖,並將該對象給予此視圖。它與用戶控件的工作方式相同。 – Arthis 2010-03-29 15:14:11

3

MVC有一定的優勢通過WebForms,但它也有一些缺點,以及我在this answer中涵蓋的細節。我認爲你必須問自己的根本問題是ViewState現在是否爲問題 - 是否必須重寫你的應用程序是一個這樣的問題?如果沒有,那麼Learning MVC是一個有價值的目標(它確實很酷),但不是我冒這個險的商業目標。

就這麼說,ViewState實際上可以在令人驚訝的大量情況下被禁用。它主要用於通過後期持續控制的價值。因此,例如,如果您有一個文本框,其值必須在服務器端以及一堆其他字段中進行檢查,ViewState將允許您處理回發,捕獲錯誤(並顯示標籤),然後將用戶返回到其表單完好無損的表單。但是,如果表單是只有需要填寫併發回,然後您將重定向到另一個頁面,您可以安全地禁用它。

最後,你問人們在做什麼以避免會話狀態。是否有理由避免會話狀態?當然,你不需要太多的信息,但完全避免它是真的沒有必要,實際上,你會花費你的武器庫中最強大的工具之一。

2

考慮一下這樣的事實,即網絡編程中的REST運動是基於對於程序的狀態是不好的想法。維基百科有一個體面的描述與參考:http://en.wikipedia.org/wiki/Representational_State_Transfer

來自傳統的ASP.NET和它提供的豐富的事件模型,MVC可以相當震撼。它確實需要管理一些以前看不見的東西,但我認爲在可測試性方面的價值(REST頁面可以很容易地觸發而不需要創建複雜的視圖狀態,並且根據定義,服務器沒有保持狀態,所以我可以單獨測試頁面/特性)會抵消學習曲線。

有關ASP中MVC的一些討論。NET和REST:http://blog.wekeroad.com/2007/12/06/aspnet-mvc-using-restful-architecture/

3

所有說ASP.NET MVC不使用狀態的答案是非常正確的。但是ASP.NET MVC實際上使用了一些狀態,儘管它不能像ViewState一樣工作。

通常,當某人將數據發佈到您的應用程序時,您將希望驗證數據並在數據無效時顯示錯誤。但是,如果您立即返回包含錯誤消息的頁面,當用戶點擊F5重新加載頁面時,數據將被重新提交。這通常不是你想要的。因此,當你意識到發佈的數據無效時,你想告訴用戶GET頁面(或者另一個頁面)並顯示一條錯誤消息。你通過返回一個HTTP重定向狀態代碼來做到這一點。但是,一旦用戶的GET請求進入,您如何知道要顯示的錯誤消息?你必須記得從你(服務器)處理POST開始直到你處理GET爲止。

爲此,請使用名爲TempData的ASP.NET MVC功能。這實際上只是Session的一個包裝器,它確保無論你插入TempData字典中的什麼東西都會一直存在,直到下一個請求而不再存在。

+1

+1舊帖子缺乏「宗教」。我們的技術人員很容易訂閱某種超級模型 - 直到它碰到**用戶**爲止。我很樂意看到一個「無國籍的應用程序」,它會告訴你,通過**來徵稅。更簡單 - 如何通過自定義產品+結帳流程以及兩者之間的導航進行定製。 – EdSF 2012-05-19 01:45:44

0

您可以用MVC3Futures project模仿查看狀態。它將保存整個模型。

您只需序列化模型並在視圖中對其進行加密即可。

@Html.Serialize("Transfer", Model, SerializationMode.EncryptedAndSigned) 

並在控制器中添加反序列化屬性。

public ActionResult Transfer(string id,[Deserialize(SerializationMode.EncryptedAndSigned)]Transfer transfer) 
0

閱讀所有這些職位後,這聽起來像MVC是不好的LOB類型的應用,在這裏你將有大量的管制,以及CRUD操作,你想保持控制的狀態。在完成提交操作後,您希望用戶保持相同視圖&的狀態有很多原因。例如顯示錯誤,服務器端驗證消息,成功消息或執行任何其他操作。將用戶重定向到某個其他視圖以顯示這些消息是不實際的。

0

您可以在會話狀態下存儲任何對象。

HttpContext.Session["userType"] = CurrentUser.GetUserType(); 
相關問題