日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > asp.net >内容正文

asp.net

.net html5 框架,ASP.NET - 介绍 ASP.NET Web 窗体框架的导航 | Microsoft Docs

發(fā)布時(shí)間:2025/3/11 asp.net 64 豆豆
生活随笔 收集整理的這篇文章主要介紹了 .net html5 框架,ASP.NET - 介绍 ASP.NET Web 窗体框架的导航 | Microsoft Docs 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

MVC

07/08/2015

本文內(nèi)容

介紹 ASP.NET Web 窗體框架的導(dǎo)航

ASP.NET Web 窗體框架的導(dǎo)航是一個(gè)托管在 navigation.codeplex.com 上的開源項(xiàng)目,該框架使您可以采用單元測(cè)試范圍來編寫 Web 窗體代碼,同時(shí)遵循“切勿重復(fù)”(DRY) 原則,從而使 ASP.NET MVC 應(yīng)用程序羨慕不已。

雖然存在一些放棄 Web 窗體并改為使用 MVC 的現(xiàn)象,但因?yàn)橛行╅_發(fā)人員越來越厭倦大量代碼隱藏不可進(jìn)行單元測(cè)試,而使這一新框架(與數(shù)據(jù)綁定一起結(jié)合使用)成為用全新的眼光看待 Web 窗體的有說服力的理由。

使用 ObjectDataSource 控件進(jìn)行的數(shù)據(jù)綁定自 Visual Studio 2005 以來已經(jīng)形成,可允許對(duì)簡(jiǎn)潔的代碼隱藏和數(shù)據(jù)檢索代碼進(jìn)行單元測(cè)試,但是存在一些妨礙其實(shí)施的問題,例如,引發(fā)異常是將業(yè)務(wù)驗(yàn)證失敗情況報(bào)告給 UI 的唯一方法。

為即將發(fā)布 Visual Studio 所做的絕大部分 Web 窗體開發(fā)工作均投入在了數(shù)據(jù)綁定上,借用 MVC 的模型綁定概念來解決這些問題,例如,引入模型狀態(tài)來解決業(yè)務(wù)驗(yàn)證失敗的通信問題。 但是,在與導(dǎo)航和數(shù)據(jù)傳遞相關(guān)的數(shù)據(jù)綁定方面仍留有兩個(gè)難點(diǎn),不過您可以使用 ASP.NET Web 窗體框架的導(dǎo)航(以下簡(jiǎn)稱“導(dǎo)航框架”)將它們輕松剔除。

第一個(gè)難點(diǎn)是沒有導(dǎo)航邏輯抽象,在 MVC 中它是被封裝在控制器方法返回類型中。 這會(huì)在數(shù)據(jù)綁定方法內(nèi)重定向調(diào)用,從而阻止其進(jìn)行單元測(cè)試。 第二個(gè)難點(diǎn)是 ObjectDataSource 參數(shù)的類型確定其值來自哪里,例如,QueryStringParameter 總是從查詢字符串中獲取其數(shù)據(jù)。 這樣會(huì)阻止在不同的導(dǎo)航上下文(如回發(fā)和非回發(fā))中使用相同的數(shù)據(jù)源,使得在讓人生畏的代碼隱藏中沒有實(shí)體邏輯。

導(dǎo)航框架可通過采用整體性的導(dǎo)航和數(shù)據(jù)傳遞方法來解決這些難點(diǎn)。 無(wú)論所執(zhí)行導(dǎo)航的類型如何(可以是超鏈接、回發(fā)、AJAX 歷史記錄或單元測(cè)試),始終采用同一方式保留所傳遞的數(shù)據(jù)。 在以后的文章中,我將介紹這一點(diǎn)如何產(chǎn)生具有完全經(jīng)過單元測(cè)試的數(shù)據(jù)檢索和導(dǎo)航邏輯的空代碼隱藏,以及對(duì)于啟用和禁用 JavaScript 的方案如何產(chǎn)生無(wú)需代碼復(fù)制的適合搜索引擎優(yōu)化 (SEO) 且逐步增強(qiáng)的單頁(yè)應(yīng)用程序。 本文介紹了導(dǎo)航框架,并通過構(gòu)建示例 Web 應(yīng)用程序演示了有關(guān)導(dǎo)航框架的一些基本但很重要的概念。

示例應(yīng)用程序

此示例 Web 應(yīng)用程序是一項(xiàng)網(wǎng)上調(diào)查。 該調(diào)查只有兩個(gè)問題并在完成后顯示一則“thank you”(非常感謝)消息。 每個(gè)問題均由單獨(dú)的 ASPX 頁(yè)面表示,分別稱為 Question1.aspx 和 Question2.aspx,而“thank you”消息也有其單獨(dú)的頁(yè)面,稱為 Thanks.aspx。

第一個(gè)問題是“Which ASP.NET technology are you currently using?”(您現(xiàn)在正在使用哪種 ASP.NET 技術(shù)?),該問題可能的回答要么是“Web 窗體”要么是“MVC”。因此,對(duì)于 Question1.aspx,我將添加問題和硬編碼的單選按鈕回答:

Question 1

Which ASP.NET technology are you currently using?

第二個(gè)問題是“Are you using the Navigation for ASP.NET Web Forms framework?”(您使用的是 ASP.NET Web 窗體框架的導(dǎo)航嗎?),其回答為“是”或“否”,可采用類似的方式進(jìn)行標(biāo)記。

開始使用

為使用導(dǎo)航框架而建立調(diào)查 Web 項(xiàng)目最直接的方法就是使用“NuGet Package Manager”(NuGet 程序包管理器)來安裝它。 從程序包管理器控制臺(tái)內(nèi)運(yùn)行“Install-Package Navigation”命令將添加所需的引用和配置。 如果您未使用 Visual Studio 2010,則可在 navigation.codeplex.com/documentation 中找到手動(dòng)安裝說明。

導(dǎo)航配置

導(dǎo)航框架可以看作是一個(gè)狀態(tài)機(jī),其中每一個(gè)不同的狀態(tài)均表示一個(gè)頁(yè)面,從一個(gè)狀態(tài)移動(dòng)到另一個(gè)狀態(tài)或在頁(yè)面之間進(jìn)行導(dǎo)航稱為轉(zhuǎn)換。 這組預(yù)定義的狀態(tài)和轉(zhuǎn)換是在 NuGet 安裝所創(chuàng)建的 StateInfo.config 文件中進(jìn)行配置的。 如果沒有此基礎(chǔ)配置,運(yùn)行調(diào)查應(yīng)用程序?qū)⒁l(fā)異常。

因?yàn)闋顟B(tài)實(shí)質(zhì)上就是頁(yè)面,所以該調(diào)查應(yīng)用程序需要三個(gè)狀態(tài),三個(gè)頁(yè)面每個(gè)頁(yè)面一個(gè)狀態(tài):

從現(xiàn)在起,我將使用其各自的鍵名來指代不同的狀態(tài),即 Question1、Question2 和 Thanks,而不使用它們表示的頁(yè)面。

因?yàn)檗D(zhuǎn)換說明了狀態(tài)之間可能的導(dǎo)航,所以調(diào)查應(yīng)用程序需要兩個(gè)轉(zhuǎn)換。 一個(gè)是針對(duì)從 Question1 到 Question2 的導(dǎo)航,另一個(gè)是針對(duì)從 Question2 到 Thanks 的導(dǎo)航。 轉(zhuǎn)換表現(xiàn)為要退出狀態(tài)的子項(xiàng),并通過其“to”(轉(zhuǎn)換到)屬性來指向要進(jìn)入的狀態(tài):

對(duì)話框是配置的最后元素并表示狀態(tài)的邏輯分組。 該調(diào)查應(yīng)用程序只需要一個(gè)對(duì)話框,因?yàn)?Question1、Question2 和 Thanks 實(shí)際上是單一導(dǎo)航路徑。 對(duì)話框的“initial”(初始)屬性必須指向開始狀態(tài),也就是說,Question1:

您會(huì)注意到,每個(gè)對(duì)話框、狀態(tài)和轉(zhuǎn)換均有一個(gè)鍵屬性。 我選擇使用頁(yè)面名稱來給狀態(tài)鍵命名,但沒有必要這樣做。 但要注意,所有的鍵在其父項(xiàng)內(nèi)必須是唯一的;例如,您不能使用具有相同鍵的同級(jí)狀態(tài)。

將 Question1.aspx 作為起始頁(yè),調(diào)查應(yīng)用程序現(xiàn)在將以 Question1 狀態(tài)成功啟動(dòng)。 但是,調(diào)查會(huì)一直滯留在此狀態(tài),因?yàn)闆]有辦法繼續(xù)進(jìn)行到 Question2。

導(dǎo)航

將不同類型的 Web 窗體導(dǎo)航分為兩大陣營(yíng)是很有用的。 非回發(fā)陣營(yíng)是控件從一個(gè) ASPX 頁(yè)面?zhèn)鬟f到另一個(gè)頁(yè)面的地方,采用的是超鏈接、重定向或轉(zhuǎn)移的形式。 回發(fā)陣營(yíng)是控件一直處于同一頁(yè)面的地方,采用的是回發(fā)、部分頁(yè)面請(qǐng)求或 AJAX 歷史記錄的形式。 后者在以后討論單頁(yè)界面模式的文章中會(huì)加以說明。 在本文中,我將重點(diǎn)介紹第一種導(dǎo)航類型。

要在頁(yè)面之間進(jìn)行移動(dòng),必須建立一個(gè) URL。 在 Visual Studio 2008 之前的版本中,唯一可用的選項(xiàng)是根據(jù)硬編碼的 ASPX 頁(yè)面名稱手動(dòng)構(gòu)建 URL,這樣會(huì)導(dǎo)致頁(yè)面之間發(fā)生緊密耦合的現(xiàn)象,從而使應(yīng)用程序非常脆弱且難以維護(hù)。 路由的引入緩解了此問題,并用可配置的路由名稱代替了頁(yè)面名稱。 然而,路由在用于 Web 環(huán)境外部時(shí)會(huì)引發(fā)異常,這一事實(shí)加上路由對(duì)模擬的抗拒使路由成為單元測(cè)試的一大絆腳石。

導(dǎo)航框架會(huì)保留路由提供的松散耦合,并且不會(huì)對(duì)單元測(cè)試造成任何妨礙。 與路由名稱的用法相似,這是上一節(jié)配置的對(duì)話框和轉(zhuǎn)換鍵(代碼中引用了這些鍵),而非硬編碼 ASPX 頁(yè)面名稱;導(dǎo)航到的狀態(tài)取決于各自的“initial”(初始)和“to”(轉(zhuǎn)換到)屬性。

返回到調(diào)查,“下一個(gè)”轉(zhuǎn)換鍵可用于從 Question1 移動(dòng)到 Question2。 我會(huì)將“下一個(gè)”按鈕添加到 Question1.aspx,并將下面的代碼添加到與其關(guān)聯(lián)的單擊處理程序中:

protected void Next_Click(object sender, EventArgs e)

{

StateController.Navigate("Next");

}

傳遞到 Navigate 方法的鍵與 Question1 狀態(tài)所配置的子轉(zhuǎn)換相匹配,隨后即會(huì)顯示由“to”(轉(zhuǎn)換到)屬性標(biāo)識(shí)的狀態(tài),即 Question2。 我會(huì)將同一按鈕和處理程序添加到 Question2.aspx。 如果您運(yùn)行該調(diào)查,就會(huì)發(fā)現(xiàn)您可以通過單擊“下一個(gè)”按鈕在這三個(gè)狀態(tài)中導(dǎo)航。

您可能已經(jīng)注意到第二個(gè)問題是針對(duì) Web 窗體的提問,如此一來,如果第一個(gè)問題的回答選擇了“MVC”,則第二個(gè)問題就無(wú)關(guān)緊要了。 因此,需要更改代碼來解決此問題,即直接從 Question1 導(dǎo)航到 Thanks,完全跳過 Question2。

當(dāng)前配置不允許從 Question1 導(dǎo)航到 Thanks,因?yàn)樗谐龅霓D(zhuǎn)換只是到 Question2。 因此,我將通過在 Question1 狀態(tài)下添加第二個(gè)轉(zhuǎn)換來更改該配置:

有了這個(gè)新的轉(zhuǎn)換,就可以很容易地調(diào)整“下一個(gè)”按鈕單擊處理程序以根據(jù)所選的答案來傳遞不同的轉(zhuǎn)換鍵:

if (Answer.SelectedValue != "MVC")

{

StateController.Navigate("Next");

}

else

{

StateController.Navigate("Next_MVC");

}

不允許用戶更改答案的調(diào)查將不會(huì)是好的調(diào)查。 目前,沒有辦法返回到上一個(gè)問題(除了瀏覽器后退按鈕以外)。 要導(dǎo)航回上一頁(yè)面,您可能認(rèn)為需要在 Thanks 下面添加兩個(gè)轉(zhuǎn)換,分別指向 Question1 和 Question2,同時(shí)在 Question2 下面添加另一個(gè)轉(zhuǎn)換,指向 Question1。 雖然這樣操作也可以奏效,但是這是不必要的,因?yàn)楹笸藢?dǎo)航功能是導(dǎo)航框架本身附帶的。

痕跡導(dǎo)航是一組鏈接,使用戶可訪問每個(gè)當(dāng)前所瀏覽頁(yè)面的上一頁(yè)面。 Web 窗體將痕跡導(dǎo)航內(nèi)置于其站點(diǎn)地圖功能中。 但是,由于站點(diǎn)地圖由固定的導(dǎo)航結(jié)構(gòu)來表示,因此,對(duì)于所給定的頁(yè)面來說,這些痕跡始終相同,與所采用的路由無(wú)關(guān)。 它們無(wú)法處理調(diào)查中出現(xiàn)的有時(shí)排除 Question2 直接路由到 Thanks 的類似情況。 通過跟蹤發(fā)生導(dǎo)航時(shí)訪問的狀態(tài),導(dǎo)航框架可構(gòu)建實(shí)際所采用路由的痕跡記錄。

為了進(jìn)行演示,我將超鏈接添加到 Question2.aspx,并在代碼隱藏中使用后退導(dǎo)航以編程方式設(shè)置其 NavigateUrl 屬性。 必須傳遞距離參數(shù),以指示要返回到的狀態(tài)有多少,值 1 意味著緊鄰的前一狀態(tài):

protected void Page_Load(object sender, EventArgs e)

{

Question1.NavigateUrl = StateController.GetNavigationBackLink(1);

}

如果您運(yùn)行應(yīng)用程序且第一個(gè)問題的答案是“Web 窗體”,您將看到 Question2.aspx 上的超鏈接會(huì)將您返回到第一個(gè)問題。

我會(huì)對(duì) Thanks.aspx 執(zhí)行同樣的操作,盡管這樣做有點(diǎn)棘手,因?yàn)樾枰獌蓚€(gè)超鏈接(每個(gè)問題一個(gè)),且用戶可能無(wú)法同時(shí)看到這兩個(gè)問題(也就是說,如果他/她對(duì)第一個(gè)問題的回答是“MVC”)。 在決定如何設(shè)置超鏈接之前,可以先檢查先前的狀態(tài)數(shù)(請(qǐng)參見圖 1)。

圖 1 動(dòng)態(tài)后退導(dǎo)航

protected void Page_Load(object sender, EventArgs e)

{

if (StateController.CanNavigateBack(2))

{

Question1.NavigateUrl = StateController.GetNavigationBackLink(2);

Question2.NavigateUrl = StateController.GetNavigationBackLink(1);

}

else

{

Question1.NavigateUrl = StateController.GetNavigationBackLink(1);

Question2.Visible = false;

}

}

現(xiàn)在,該調(diào)查功能正常,可允許您填寫問題和修改先前的回答。 但是,如果這些回答不投入使用,那么調(diào)查幾乎沒有意義。 我將介紹回答數(shù)據(jù)是如何從 Question1 和 Question2 傳遞到 Thanks 的,在這里回答數(shù)據(jù)將顯示在摘要窗體中。

數(shù)據(jù)傳遞

和導(dǎo)航一樣,在 Web 窗體中傳遞數(shù)據(jù)的方式也是多種多樣。 對(duì)于非回發(fā)導(dǎo)航,其中控件從一個(gè)頁(yè)面?zhèn)鬟f到另一個(gè)頁(yè)面(通過超鏈接、重定向或轉(zhuǎn)移),可以使用查詢字符串或路由數(shù)據(jù)。 對(duì)于回發(fā)導(dǎo)航,其中控件一直處于同一頁(yè)面(通過回發(fā)、部分頁(yè)面請(qǐng)求或 AJAX 歷史記錄),控件值、視圖狀態(tài)或事件參數(shù)可能是候選對(duì)象。

在 Visual Studio 2005 之前的版本中,代碼隱藏承擔(dān)處理此傳入的數(shù)據(jù),因此,它們充滿了值提取和類型轉(zhuǎn)換邏輯。 數(shù)據(jù)源控件和選擇參數(shù)(在下一版本的 Visual Studio 中為“值提供程序”)的引入大大減輕了它們的負(fù)擔(dān)。 然而,這些選擇參數(shù)受限于特定數(shù)據(jù)源,它們無(wú)法根據(jù)導(dǎo)航上下文動(dòng)態(tài)切換源。 例如,它們不能從控件或從查詢字符串(具體取決于它是否為回發(fā))中有選擇地檢索其值。 處理這些限制會(huì)導(dǎo)致代碼回漏到代碼隱藏,從而使問題退回到具有過多且不可測(cè)試的代碼隱藏的起點(diǎn)。

導(dǎo)航框架可通過提供單一數(shù)據(jù)源(稱為狀態(tài)數(shù)據(jù),無(wú)論涉及何種導(dǎo)航)來避免出現(xiàn)此類問題。 第一次加載頁(yè)面時(shí),狀態(tài)數(shù)據(jù)將使用導(dǎo)航期間傳遞的任何數(shù)據(jù)來填充,方法類似于查詢字符串或路由數(shù)據(jù)。 但是,顯著的差別在于狀態(tài)數(shù)據(jù)不是只讀數(shù)據(jù),因此當(dāng)發(fā)生后續(xù)回發(fā)導(dǎo)航時(shí),狀態(tài)數(shù)據(jù)可以進(jìn)行更新以反映頁(yè)面當(dāng)前最新內(nèi)容。 當(dāng)我在本部分末尾重新訪問導(dǎo)航時(shí),將證明這一點(diǎn)是非常有益處的。

我將更改調(diào)查,以便將第一個(gè)問題的回答傳遞到 Thanks 狀態(tài),在這里數(shù)據(jù)將重新顯示在用戶面前。 在通過鍵值對(duì)集合進(jìn)行導(dǎo)航的同時(shí)傳遞數(shù)據(jù),這稱為 NavigationData。 我將更改 Question1.aspx 的“下一個(gè)”單擊處理程序,以便將第一個(gè)問題的回答傳遞到下一個(gè)狀態(tài):

NavigationData data = new NavigationData();

data["technology"] = Answer.SelectedValue;

if (Answer.SelectedValue != "MVC")

{

StateController.Navigate("Next", data);

}

else

{

StateController.Navigate("Next_MVC", data);

}

此 NavigationData 是在導(dǎo)航期間傳遞的,用來初始化通過 StateContext 對(duì)象上的 Data 屬性供下一個(gè)狀態(tài)使用的狀態(tài)數(shù)據(jù)。 我會(huì)將標(biāo)簽添加到 Thanks.aspx,并將該標(biāo)簽的 Text 屬性設(shè)置為顯示傳入的回答:

Summary.Text = (string) StateContext.Data["technology"];

如果您運(yùn)行該調(diào)查,則會(huì)注意到僅在第一個(gè)問題的回答是“MVC”時(shí)才顯示此摘要信息;從不會(huì)顯示“Web 窗體”的回答。 這是因?yàn)?NavigationData 只能用于下一個(gè)狀態(tài),但不可用于后續(xù)導(dǎo)航產(chǎn)生的所有狀態(tài)。 因此,“Web 窗體”的回答存在于 Question2 狀態(tài)數(shù)據(jù)中,但在到達(dá) Thanks 時(shí)不可用。 解決此問題的一個(gè)方法是更改 Question2.aspx,以便它將回答中繼到第一個(gè)問題,也就是說,在 Question2.aspx 導(dǎo)航時(shí)將回答從其狀態(tài)數(shù)據(jù)中取出并將該回答傳遞到 Thanks:

NavigationData data = new NavigationData();

data["technology"] = StateContext.Data["technology"];

StateController.Navigate("Next", data);

這種方法并不理想,因?yàn)樗鼘?Question1 和 Question2 緊密耦合到一起,強(qiáng)迫后者狀態(tài)注意前者正在傳入的數(shù)據(jù)。 例如,如果不對(duì) Question2.aspx 進(jìn)行相應(yīng)的更改,就無(wú)法在第一個(gè)和第二個(gè)問題之間插入新的問題。 前瞻性的實(shí)施包括創(chuàng)建新的包含所有的 Question2 狀態(tài)數(shù)據(jù)的 NavigationData;可通過向 NavigationData 構(gòu)造函數(shù)傳遞 true 來實(shí)現(xiàn)這一點(diǎn):

NavigationData data = new NavigationData(true);

StateController.Navigate("Next", data);

狀態(tài)數(shù)據(jù)與查詢字符串或路由數(shù)據(jù)之間的另一個(gè)關(guān)鍵的區(qū)別在于,采用狀態(tài)數(shù)據(jù)您并不局限于傳遞字符串。 我會(huì)將一個(gè)布爾值傳遞給 Thanks(即用 true 值對(duì)應(yīng)于“是”),而不是像對(duì) Question1 和 Question2 所做的那樣以字符串的形式傳遞答案:

NavigationData data = new NavigationData(true);

data["navigation"] = Answer.SelectedValue == "Yes" ?

true : false;

StateController.Navigate("Next", data);

您可以看到,在從 Thanks 狀態(tài)數(shù)據(jù)中檢索它后將保留其數(shù)據(jù)類型:

Summary.Text = (string) StateContext.Data["technology"];

if (StateContext.Data["navigation"] != null)

{

Summary.Text += ", " + (bool) StateContext.Data["navigation"];

}

該調(diào)查已完成,但還有一個(gè)問題: 使用后退導(dǎo)航超鏈接時(shí)問題的回答不會(huì)被保留。 例如,當(dāng)從 Thanks 返回到 Question1 時(shí),上下文即會(huì)丟失,因此默認(rèn)的“Web 窗體”單選按鈕始終處于選中狀態(tài),這與所給答案無(wú)關(guān)。

在上一部分中,您了解到后退導(dǎo)航相對(duì)于靜態(tài)站點(diǎn)地圖痕跡的優(yōu)點(diǎn)。 站點(diǎn)地圖生成的痕跡的另一個(gè)限制就是它們不攜帶任何數(shù)據(jù)。 這意味著跟隨它們可能會(huì)丟失上下文信息。 例如,它們?cè)趶?Thanks 返回到 Question1 時(shí)無(wú)法傳遞先前選擇的“MVC”答案。 通過跟蹤與發(fā)生導(dǎo)航時(shí)訪問的狀態(tài)相關(guān)聯(lián)的狀態(tài)數(shù)據(jù),導(dǎo)航框架可構(gòu)建上下文相關(guān)的痕跡記錄。 在后退導(dǎo)航期間,此狀態(tài)數(shù)據(jù)將被還原,從而允許重新創(chuàng)建與之前完全相同的頁(yè)面。

借助上下文相關(guān)的后退導(dǎo)航,我可以更改調(diào)查,從而在重新訪問狀態(tài)時(shí)使答案得到保留。 第一階段是在離開頁(yè)面之前,將回答設(shè)置到“下一個(gè)”單擊處理程序中的狀態(tài)數(shù)據(jù)中:

StateContext.Data["answer"] = Answer.SelectedValue;

現(xiàn)在,在重新訪問 Question1 或 Question2 時(shí),狀態(tài)數(shù)據(jù)將包含之前選擇的答案。 這樣,采用 Page_Load 方法檢索此答案和預(yù)先選擇相關(guān)的單選按鈕就是一件非常簡(jiǎn)單的事情:

protected void Page_Load(object sender, EventArgs e)

{

if (!Page.IsPostBack)

{

if (StateContext.Data["answer"] != null)

{

Answer.SelectedValue =

(string)StateContext.Data["answer"];

}

}

}

調(diào)查現(xiàn)已完成,不容易受到在用戶按下瀏覽器后退按鈕(或同時(shí)打開多個(gè)瀏覽器窗口)時(shí) Web 應(yīng)用程序中經(jīng)常遇到的錯(cuò)誤的影響。 在特定于頁(yè)面的數(shù)據(jù)保存在服務(wù)器端會(huì)話中時(shí),通常會(huì)出現(xiàn)此類問題。 雖然只有一個(gè)會(huì)話對(duì)象,但是單個(gè)頁(yè)面可能會(huì)有多個(gè)“當(dāng)前”版本。 例如,使用后退按鈕從瀏覽器緩存中檢索“陳舊”版本的頁(yè)面可能會(huì)造成客戶端和服務(wù)器出現(xiàn)不同步情況。 導(dǎo)航框架就不會(huì)面臨這類問題,因?yàn)樗鼪]有任何服務(wù)器端緩存。 實(shí)際上,狀態(tài)、狀態(tài)數(shù)據(jù)和痕跡記錄均保留在 URL 中。 然而,這意味著用戶可以通過編輯 URL 來對(duì)這些值進(jìn)行更改。

使 MVC 羨慕嫉妒恨

之前我說過您可以使用導(dǎo)航框架創(chuàng)建 Web 窗體代碼,使 MVC 羨慕嫉妒恨。 在一番大膽的言辭之后,您可能通過調(diào)查示例應(yīng)用程序感覺到了一點(diǎn)小小的改變,因?yàn)檫@可能使 MVC 忍氣吞聲地避免其代碼隱藏發(fā)出的不盡人意的氣息。 但是請(qǐng)不要絕望;這僅僅是介紹核心概念。 后續(xù)文章將重點(diǎn)介紹體系結(jié)構(gòu)的完整性,尤其會(huì)將著重點(diǎn)放在單元測(cè)試和 DRY 原則上。

在第二期中,我將采用空代碼隱藏來構(gòu)建一個(gè)數(shù)據(jù)綁定示例并完成單元測(cè)試代碼范圍。 此范圍甚至?xí)ㄔ?MVC 應(yīng)用程序中號(hào)稱測(cè)試?yán)洗箅y的導(dǎo)航代碼。

在第三期中,我將構(gòu)建 SEO 友好的單頁(yè)應(yīng)用程序。 在這里,將使用逐步增強(qiáng)的方式,在啟用 JavaScript 時(shí)采用 ASP.NET AJAX,在禁用 JavaScript 時(shí)妥善降級(jí),在這兩種情況下使用的數(shù)據(jù)綁定方法相同。 同樣,在 MVC 應(yīng)用程序中很難辦到這一點(diǎn)。

如果這激發(fā)了您的興趣,您迫不及待地要嘗試一些更多高級(jí)功能,請(qǐng)務(wù)必從 navigation.codeplex.com 中下載全面的功能文檔和示例代碼。

Graham Mendick?是 Web 窗體最忠實(shí)的粉絲,希望向大家展示 Web 窗體也能夠像 ASP.NET MVC 一樣擁有合理的架構(gòu)。 他撰寫了 ASP.NET Web 窗體框架的導(dǎo)航,他相信將其與數(shù)據(jù)綁定結(jié)合使用一定能給 Web 窗體注入新的活力。

衷心感謝以下技術(shù)專家對(duì)本文的審閱: Damian Edwards

總結(jié)

以上是生活随笔為你收集整理的.net html5 框架,ASP.NET - 介绍 ASP.NET Web 窗体框架的导航 | Microsoft Docs的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。