ASP.NET MVC添加新控制器示例

ASP.NET?MVC高效構建Web應用- 商品搜索 - 京東

控制器(Controllers)是一個協調視圖和模型直接關系的特殊類。它響應用戶輸入,與模型進行對話,并決定呈現哪個視圖(如果有的話)。在ASP.NET MVC中,這個類文件通常以后綴名Controller表示。讓我們從新建一個控制器類開始動手。

3.2.1? 新建項目添加控制器源文件

我們首先將新建一個MVC項目,后續內容就基于此項目逐漸新增內容展開講解。

【例3.1】添加一個新控制器

(1)打開VS,新建一個基于MVC的ASP.NET項目,項目名稱是test。

(2)我們從創建控制器類開始。在解決方案資源管理器中,右鍵單擊 Controllers文件夾,然后單擊“添加”,再單擊“控制器”,此時出現“添加已搭建基架的新項”,在該對話框上,我們單擊“MVC 5 控制器- 空”,如圖3-2所示。

圖3?2

然后單擊“添加”。將新控制器命名為“HelloWorldController”,如圖3-3所示。

圖3?3

然后單擊“添加”。此時,解決方案資源管理器將創建名為HelloWorldController.cs的新文件和一個新文件夾Views\HelloWorld,位置如圖3-4所示。

圖3?4

(3)在控制器中準備添加代碼。我們在解決方案資源管理器中雙擊打開控制器源文件HelloWorldController.cs,然后刪除類HelloWorldController下的Index函數,并添加兩個新函數,代碼如下:

public class HelloWorldController : Controller{// 訪問方式:/HelloWorldpublic string Index()?{return "This is my <b>default</b> action..."; //該字符串顯示在網頁上,<b>是粗體的意思}// 訪問方式:/HelloWorld/Welcome/public string Welcome(){return "This is the Welcome action method..."; //該字符串顯示在網頁上}}

我們新增的控制器名稱是HelloWorldController,第一個方法是Index,當我們訪問控制器(http://localhost:xxxx/HelloWorld)時候,將默認調用這個Index方法,此時它返回一個字符串,因此在網頁瀏覽器中能看到這個字符串。另外一個方法是Welcome,當我們在瀏覽器中訪問URL地址“http://localhost:xxxx/HelloWorld/Welcome”時,將調用該方法,該方法也是返回一個字符串,因此我們可以在瀏覽器中看到這個字符串。

(4)按ctrl+F5運行項目,然后在彈出的瀏覽器的地址欄中輸入“https://localhost:44308/HelloWorld”,此時就可以在頁面上看到方法Index中返回的字符串了,如圖3-5所示。

訪問https://localhost:44308/HelloWorld相當于訪問https://localhost:44308/HelloWorld/index,index可以省略不寫。可以看出,網頁上顯示的字符串正是Index方法中返回的字符串,而且返回的字符串中帶有的html標記<b></b>也起作用了,它的作用就是讓<b>和</b>之間的字符變粗體。接著,我們再在瀏覽器地址欄中輸入“https://localhost:44308/HelloWorld/Welcome”,此時將調用HelloWorldController控制器中的Welcome方法,該方法也是返回一個字符串,因此網頁上也能看到一個字符串,如圖3-6所示。

?????

可見結果正確。另外,在ASP.NET MVC中,默認情況下,路由解析是不區分大小寫的,因此我們在地址欄中把“HelloWorld/Welcome”全部寫成小寫,也是可以正常顯示網頁。如果需要讓MVC的路由匹配變得大小寫敏感,你可以通過在RouteConfig.cs中定義路由的時候使用正則表達式來實現,但通常沒有必要。

現在我們理解了,ASP.NET MVC 根據傳入 URL 調用不同的控制器類,并調用不同的操作方法(比如我們例子中的Index方法和Welcome方法)。

3.2.2? 基于路由為方法增加一個參數

至此,我們并沒有傳遞參數給Welcome方法,實際開發中,通常會在URL中傳遞一些數據給內部方法,那我們要傳數據給方法,URL如何寫呢?可以這樣寫:

/[Controller]/[ActionName]/[Parameters]

Controller表示控制器名稱,ActionName表示方法名稱,Parameters表示要傳給方法的參數,比如http://localhost:xxx/HelloWorld/Welcome/1,這個1就是可以傳給Welcome方法的參數。那為何可以這樣寫呢?這個url格式在哪里指定呢?我們可以打開App_Start/RouteConfig.cs文件查看路由格式,該函數如下:

public static void RegisterRoutes(RouteCollection routes){routes.IgnoreRoute("{resource}.axd/{*pathInfo}");routes.MapRoute(name: "Default",url: "{controller}/{action}/{id}",defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional });}

原來是在這個自動生成的函數中規定了這樣的url格式,而且參數的名稱也規定了,即id。那么我們在方法中也要定義一個名稱為id的參數,然后就可以得到URL中的參數值了。

我們看url那一行,{id}處在參數的位置上,表示要傳給方法action的參數,我們只需要在。defaults表示如果URL中不寫具體的方法名稱,那么默認訪問的方法就是Home控制器中Index,而且參數是可選的(UrlParameter.Optional),也就是可以沒有,這樣我們運行應用程序但不提供任何 URL 段時,它默認為在上述代碼的defaults 節中指定的Home控制器和Index操作方法。注意:Home控制器是新建項目就默認生成的,我們手動添加的控制器是HelloWorld。

了解了格式后,我們趁熱打鐵,趕緊在Welcome方法中添加一個參數,代碼如下:

public string Welcome(int id){return HttpUtility.HtmlEncode("data from url:"+ id);}

我們要把參數id在網頁上顯示出來。HttpUtility.HtmlEncode用于將字符串轉換為HTML編碼格式的字符串,目的是為了保護應用程序免受惡意輸入(因為我們的程序通過URL接收輸入參數,所以要做好一定的防護),因此我們需要通過對字符串應用HTML 編碼以防在Web應用程序中受到腳本攻擊。

運行項目,然后在瀏覽器的地址欄中輸入URL:https://localhost:44308/HelloWorld/Welcome/100,回車后,網頁就出現了“data from url:100”,如圖3-7所示。

圖3-7

可以看到,參數100傳給了Welcome方法,然后在網頁上顯示出來,有興趣的朋友還可以改100為其他數字,都可以正確顯示出來。值得注意,Welcome方法中的參數名id必須和RegisterRoutes方法中{id}一致,如果Welcome方法中的參數名不是id,那就會出錯了。但如果Welcome方法中寫成了大寫ID,那是沒事的,結果照樣正確,說明此方法對大小寫不敏感。

有朋友可能會執拗,就偏要在Welcome方法中用其他參數名稱,咋辦?很簡單,在RegisterRoutes方法中,把{id}改為你想要的名稱,比如我們改為{age},那么我們在Welcome方法中就可以用age作為參數名了,我們馬上試試。修改RegisterRoutes方法如下:

public static void RegisterRoutes(RouteCollection routes){???routes.IgnoreRoute("{resource}.axd/{*pathInfo}");//把兩處id改為ageroutes.MapRoute(name: "Default",url: "{controller}/{action}/{age}",?defaults: new { controller = "Home", action = "Index", age = UrlParameter.Optional });}

然后再修改Welcome方法如下:

public string Welcome(int age){return HttpUtility.HtmlEncode("data from url:"+ age);}

也就是把參數名改為了age,返回的字符串也用了age。

馬上運行項目,輸入URL:https://localhost:44308/HelloWorld/Welcome/66,運行結果如圖3-8所示。

圖3?8

運行正確,現在我們知道如何使用自己想用的參數名了,原來需要在注冊路由方法RegisterRoutes中修改一下。

3.2.3? 基于路由為方法增加多個參數

剛剛我們把URL上的參數傳遞給了方法Welcome,但我們只是傳遞了一個參數,現在我們來傳遞多個參數。首先我們要在路由配置文件RouteConfig.cs中添加一個新路由,添加代碼如下:

routes.MapRoute(name: "abc",url: "{controller}/{action}/{name}/{height}/{age}");

這里的路由名稱name隨便取,比如abc;最關鍵的是url,這里我們在{action}后面添加了3個參數,分別是name、height和age,它們將傳入方法Welcome中,因此接下來我們要為Welcome方法添加參數,打開HelloWorldController.cs,修改Welcome方法如下所示:

public string Welcome(string name,float height, int age = 10){return HttpUtility.HtmlEncode("Hello " + name + ", your height:"+height+" and age:"+age);}

馬上運行項目,輸入URL:https://localhost:44308/HelloWorld/Welcome/Tom/1.81/20,運行結果如圖3-9所示。

圖3-9

運行正確,我們把3個參數值都顯示出來了。現在,我們知道如何傳多個參數給方法了。

在路由配置文件RouteConfig.cs中,擁有2個條路由,一條是名為Default的路徑,另外一條是名為abc的路徑。我們可以按兩種url來訪問,但前提是要定義好和url參數對應的方法。比如現在按照Default中的url(url: "{controller}/{action}/{age}")方式來訪問就出錯了,輸入URL:https://localhost:44308/helloWorld/Welcome/22,運行結果如圖3-10所示。

這是因為Welcome需要3個參數呢,而我們在URL中就給了一個參數,所以報錯了。我們可以在HelloWorldController類中增加一個方法,使其擁有一個參數,代碼如下:

public string howold(int age){return HttpUtility.HtmlEncode("age:" + age);}

然后運行項目,輸入URL:https://localhost:44308/helloWorld/howold/22,運行結果如圖3-11所示。

???

運行正確。現在我們既可以輸入1個參數,也可以輸入3個參數給不同的方法了,兩種URL路徑都能使用到。

3.2.4? 不改變路由為方法增加多個參數

剛剛我們為了傳遞多個參數給方法,還特意添加了一條新路由,略顯繁瑣,其實也可以不新增路由來傳遞多個參數的。方法是通過查詢字符串。現在我們基于已經存在的路由Default,來為Welcome方法添加多個參數,目前Default路由是這樣的:

routes.MapRoute(name: "Default",url: "{controller}/{action}/{age}",defaults: new { controller = "Home", action = "Index", age = UrlParameter.Optional });

age已經是一個參數了,它所需要的URL如下:

http://localhost:xxx/HelloWorld/Welcome/20

現在,我們可以在1后面加問號(?),然后再加查詢字符串,比如:

http://localhost:xxx/HelloWorld/Welcome/20?name=Tom&height=1.81

“name=Tom&height=1.81”就是查詢字符串,name和height是參數名,必須和Welcome方法中的參數名相同,Tom和1.81是參數值,也就是傳給Welcome方法的實參。而Welcome方法目前的代碼是這樣的:

public string Welcome(string name,float height, int age = 10){return HttpUtility.HtmlEncode("Hello " + name + ", your height:"+height+" and age:"+age);}

正好3個參數,name和height對應查詢字符串中name和height,age對應Default路徑中url規定的age。運行項目,輸入URL:https://localhost:44308/helloWorld/Welcome/20?name=Alice&height=1.68,運行結果如圖3-12所示。

圖3-12

運行正確。通過查詢字符串的方式,我們即使不新增路由,也可以給方法傳遞多個參數值。不信的話,可以把路由abc刪除,結果依然正確。但要注意,查詢字符串會在URL中暴露參數名稱。

這個實例寫到這里該結束了,否則太長了。在整個實例中,控制器一直在執行 MVC的VC部分,即視圖和控制器的工作。控制器將直接返回 HTML。通常,人們不希望控制器直接返回 HTML,因為這會使代碼變得非常繁瑣。相反,我們通常使用單獨的視圖模板文件來幫助生成HTML響應,后續我們將實現這個效果。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/82817.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/82817.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/82817.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Escrcpy(安卓手機投屏軟件) v1.29.6 中文綠色版

在數字設備日益普及的今天&#xff0c;用戶對于設備的控制和管理需求也在不斷增加。對于Android設備用戶來說&#xff0c;Escrcpy這款強大的工具無疑是一個福音。它不僅提供了直觀的圖形化界面&#xff0c;讓用戶能夠輕松顯示和控制自己的Android設備&#xff0c;還以完全免費開…

Python爬蟲實戰:研究Goose框架相關技術

一、引言 隨著互聯網的迅速發展,網絡上的信息量呈爆炸式增長。從海量的網頁中提取有價值的信息成為一項重要的技術。網絡爬蟲作為一種自動獲取網頁內容的程序,在信息收集、數據挖掘、搜索引擎等領域有著廣泛的應用。本文將詳細介紹如何使用 Python 的 Goose 框架構建一個完整…

【Linux 學習計劃】-- 馮諾依曼體系 | 操作系統的概念與定位,以及其如何管理軟件

目錄 馮諾依曼體系結構 操作系統是干什么的&#xff1f; 理解操作系統中的管理 對OS&#xff08;操作系統&#xff09;宏觀、整體的分析 總結 結語 馮諾依曼體系結構 首先我們來看這樣一張圖&#xff0c;這就是大名鼎鼎的馮諾依曼體系 在日常生活中&#xff0c;所有的計…

新消息!阿里云ACP大模型認證有變化!

阿里云ACP認證是阿里云認證中的高級工程師&#xff0c;ACP認證方向有云計算、大數據、人工智能、大模型等多個&#xff0c;大家都知道&#xff0c;阿里云ACP考試題量共100題&#xff0c;其中70道單選題30道多選題&#xff0c;每題一分&#xff0c;滿分100分&#xff0c;80分合格…

MySQL 數據遷移Postgresql(openGuass) 之 pg_chameleon

1 pg_chameleon 介紹 pgchameleon 是一款MySQL 到 PostgreSQL/openGuass 的復制工具。 pg_chameleon 使用場景&#xff1a; 1&#xff09;分析 2&#xff09;遷移 3&#xff09;對多個MySQL 數據庫進行數據聚合 操作系統信息 (myenv) rootu24-pg-60:~# cat /etc/issue Ubuntu …

Spark 中,map和foreach的區別

在 Spark 中&#xff0c;map和foreach是兩種不同用途的轉換操作&#xff0c;主要區別在于&#xff1a; 1. 操作類型與返回值 map&#xff1a;是轉換操作&#xff08;Transformation&#xff09;&#xff0c;返回一個新的 RDD。foreach&#xff1a;是行動操作&#xff08;Acti…

More SQL(Focus Subqueries、Join)

目錄 Subqueries Subqueries That Return One Tuple Subqueries and Self Connection The IN Operator The Exists Operator The Operator ANY The Operator ALL Union, Intersection, and Difference&#xff08;交并差&#xff09; Bag Semantics Controlling Dupl…

OpenGL Chan視頻學習-4 Vertex Buffers and Drawing a Triangle in OpenGL

一、視頻鏈接 【最好的OpenGL教程之一】https://www.bilibili.com/video/BV1MJ411u7Bc?p5&vd_source44b77bde056381262ee55e448b9b1973 二、相關網站 docs.gl 三、代碼整理 c #include <GL/glew.h> #include <GLFW/glfw3.h>#include<iostream>int…

WSL中ubuntu通過Windows帶代理訪問github

WSL中ubuntu通過Windows帶代理訪問github 前言: WSL是Windows下的ubuntu訪問工具&#xff0c;目前無法訪問外網&#xff0c;因此需要配置一下。 步驟一 代理中進行如下設置: 步驟二 ubuntu22.04中修改配置 使用如下命令獲取IP地址&#xff1a; ip route | grep default | aw…

為(FramePack)的視頻生成添加首尾幀功能

文章目錄 &#xff08;一&#xff09;前言&#xff08;二&#xff09;可選的尾幀&#xff08;三&#xff09;測試&#xff08;四&#xff09;例子 &#xff08;一&#xff09;前言 前提是這個&#xff1a;《筆記本6GB本地可跑的圖生視頻項目&#xff08;FramePack&#xff09;…

C語言中:遞歸問題的深入研究

C語言中&#xff1a;遞歸問題的深入研究 函數的遞歸有兩個限制條件&#xff1a; 1.遞歸存在限制條件&#xff0c;當滿?這個限制條件的時候&#xff0c;遞歸便不再繼續。 2.每次遞歸調?之后越來越接近這個限制條件。 例子&#xff1a; #include <stdio.h> int main…

《C++20新特性全解析:模塊、協程與概念(Concepts)》

引言&#xff1a;C20——現代C的里程碑 C20是繼C11之后最具革命性的版本&#xff0c;它通過模塊&#xff08;Modules&#xff09;、協程&#xff08;Coroutines&#xff09;和概念&#xff08;Concepts&#xff09;三大核心特性&#xff0c;徹底改變了C的代碼組織方式、并發模…

xcode卡死問題,無論打開什么程序xcode總是在轉菊花,重啟電腦,卸載重裝都不行

很可能是因為我們上次沒有正常關閉Xcode&#xff0c;而Xcode保留了上次錯誤的一些記錄&#xff0c;而這次打開Xcode依然去加載錯誤的記錄&#xff0c;所以必須完全刪除這些記錄Xcode才能加載正常的項目。 那么也就是說&#xff0c;我們是不是只需要刪除這部分錯誤記錄文件就可以…

華為云Flexus+DeepSeek征文|華為云Flexus云服務器X實例上部署Dify:打造高效的開源大語言模型應用開發平臺

目錄 前言 1 Dify與華為云部署概述 1.1 什么是 Dify 1.2 華為云與 Flexus 云服務器的優勢 2 云服務器部署 Dify 的步驟詳解 2.1 模板選擇 2.2 參數配置 2.3 資源棧設置 2.4 確認部署信息并執行 3 部署成功后的操作與平臺使用指南 3.1 訪問平臺 3.2 設置管理員賬號 …

物流項目第九期(MongoDB的應用之作業范圍)

本項目專欄&#xff1a; 物流項目_Auc23的博客-CSDN博客 建議先看這期&#xff1a; MongoDB入門之Java的使用-CSDN博客 需求分析 在項目中&#xff0c;會有兩個作業范圍&#xff0c;分別是機構作業范圍和快遞員作業范圍&#xff0c;這兩個作業范圍的邏輯是一致的&#xf…

網絡拓撲如何跨網段訪問

最近領導讓研究下跟甲方合同里的&#xff0c;跨網段訪問怎么實現&#xff0c;之前不都是運維網工干的活么&#xff0c;看來裁員裁到動脈上了碰到用人的時候找不到人了&#xff0c; 只能趕鴨子上架讓我來搞 IP 網絡中&#xff0c;不同網段之間的通信需要通過路由器&#xff0c;…

【前端】PWA

目錄 概述實戰vue項目問題匯總 PWA&#xff08;漸進式 Web 應用&#xff0c;Progressive Web App&#xff09; 2015提出 概述 PWA 是一種提升 Web 應用體驗的技術&#xff0c;使其具備與原生應用相似的功能和性能。PWA不僅能夠在網頁上運行&#xff0c;還能在手機或桌面上像傳…

湖北理元理律師事務所:從法律合規到心靈契合的服務升維

債務優化不僅是數字游戲&#xff0c;更是信任重建的過程。湖北理元理律師事務所在實踐中發現&#xff1a;68%的債務糾紛中存在溝通斷裂。為此&#xff0c;機構構建了“三維信任修復機制”。 維度一&#xff1a;信息透明的技術實現 區塊鏈存證艙&#xff1a;客戶手機實時查看律…

香橙派3B學習筆記2:Vscode遠程SSH登錄香橙派_權限問題連接失敗解決

Vscode下載插件&#xff0c;ssh遠程登錄香橙派。 ssh &#xff1a; orangepi本地ip 密碼 &#xff1a; orangepi 安裝 Remote - SSH 擴展SSH插件&#xff1a; SSH遠程連接&#xff1a; ssh usernameremote_host ssh -p port_number usernameremote_host默認22端口號就用第一行…

VMware安裝Ubuntu實戰分享大綱

深入解析快速排序 一、分治策略分解 分解階段&#xff1a; 選擇基準元素 $pivot$將數組劃分為三個子集&#xff1a; $$ left {x | x < pivot} $$ $$ equal {x | x pivot} $$ $$ right {x | x > pivot} $$ 遞歸排序&#xff1a; 對 left 和 right 子集遞歸調用快速排…