ASP.NET MVC5基礎-控制器(Controller)詳解

来源:https://www.cnblogs.com/aoede-jacqueline/archive/2019/11/29/11956706.html
-Advertisement-
Play Games

在上文ASP.NET MVC5基礎 – MVC文件架構中我們簡單瞭解了下控制器Controller的作用,本文我將詳細介紹控制器Controller的使用方法。 Controller的運行過程 上文我們已經講到,控制器負責響應瀏覽器傳送過來的所有請求。在MVC中,每一個瀏覽器請求都映射到一個控制器( ...


在上文ASP.NET MVC5基礎 – MVC文件架構中我們簡單瞭解了下控制器Controller的作用,本文我將詳細介紹控制器Controller的使用方法。

Controller的運行過程

上文我們已經講到,控制器負責響應瀏覽器傳送過來的所有請求。在MVC中,每一個瀏覽器請求都映射到一個控制器(Controller)中,每個請求都會有個動作(Action),只要動作存在,就可以通過該動作方法接收客戶端傳來的請求與決定響應的視圖(View)。

我們以之前創建的MVC項目為例,打開項目的Index.cshtml頁面。

顯示的界面如下:

可以看到,頁面的地址欄URL為:http://localhost:61515/Home/Index

根據路由規則,Home是控制器(Controller)名,Index是動作(Action)名。所以這個URL調用的是HomeController控制器下的Index方法。

在Index方法中,只有這麼一行代碼:return View();,表示返回視圖,然後返回給瀏覽器的是Views/Home文件夾下的Index.cshtml頁面。

雖然我們在Index方法中沒有指定返回哪個頁面,但根據ASP.NET MVC的約定規則,控制器會找到Views文件夾中,與Controller名稱相同文件夾下的同一方法名的頁面。所以返回的是Home下的Index.cshtml頁面。具體的有關控制器返回View的內容下文會詳細說明。

控制器的運行過程大體如上,從瀏覽器請求到控制器返回結果的整體流程為:

Controller請求參數處理

試想一下,我們在瀏覽器地址欄經常能看到URL後面接很多個參數,比如百度搜索:https://www.baidu.com/s?ie=UTF-8&wd=夢中的Aoede 在URL後面接了ie和wd兩個參數,那麼這種參數在MVC中是怎樣獲取的呢?

舉個例子,我們給首頁鏈接增加兩個參數:http://localhost:61515/Home/Index?name=夢中的Aoede&age=18

那麼在Index方法中,正常情況我們可以通過Request.QueryString獲取到這兩個參數。如下:

public ActionResult Index()
{
    var name = Request.QueryString["name"];
    var age = Request.QueryString["age"];
    return Content($"name:{name},age:{age}");
}

打開http://localhost:61515/Home/Index?name=夢中的Aoede&age=18,顯示如下:

其實在MVC中,參數的傳遞是通過模型綁定(Model Binding)機制從RequestContext中獲取到參數數據的。獲取到數據之後再將數據傳入到方法的參數中,所以我們只需要在方法中增加兩個參數即可,如下:

public ActionResult Index(string name,int age)
{
    return Content($"name:{name},age:{age}");
}

打開頁面輸出結果還是一樣的:


相同的,如果瀏覽器通過POST方式傳過來一個表單,那麼我們也可以在Index參數中使用表單對應的Model實體類來接收。在此我就不贅述了。

Controller返回值說明

Action處理完請求後,會將結果返回給客戶端。Action返回的結果我們稱為動作結果(Action Result)。

所有的動作結果都繼承自ActionResult基類,以HomeController中的Index方法為例,它return的View()就是一個ViewResult類,ViewResult類也是ActionResult的子類。

ASP.NET MVC框架支持六種標準類型的動作結果:

動作名稱

概述

方法名

ViewResult

視圖內容,HTML或標記

View

EmptyResult

空內容

 

RedirectResult

重定向到新的URL

Redirect

RedirectToRouteResult

重定向到新的控制器

RedirectToAction/RedirectToRoute

JsonResult

返回一個JSON(Javascript Object Notation)內容

Json

ContentResult

返迴文本內容

Content

需要註意的是,雖然控制器返回的是動作結果(Action Result),但在代碼中,我們調用的是Controller基類中的方法。在上文的表中有對應的方法名。

除了以上六種動作結果以外,你還可以給Action方法返回其他類型的返回值,這個返回值會自動被包裝在ContentResult中。比如這段代碼:

public class HomeController : Controlle
{
    public DateTime Index()
    {
        return DateTime.Now;
    }
}

Index返回的是DateTime對象,而在瀏覽器中,顯示的是一個日期字元串。

MVC過濾器

過濾器在MVC中也是個非常重要的概念,本文僅簡單介紹下什麼是過濾器,詳細的內容我會在後續文章中深入說明。

過濾器(Filters)就是向請求處理管道中註入額外的邏輯。

過濾器有不同類型,MVC支持的過濾器有:授權(Authorization)、行為(Action)、結果(Result)和異常(四種),不同類型有不同的作用。

我們以授權(Authorization)為例簡單說明下。比如我們有個方法,只有登錄用戶才可以調用,那麼我們只需要添加一個驗證用戶是否登錄的授權過濾器,在對應的方法上方添加此過濾器的標記即可。

總結

通過本文可以瞭解到,Controller的運行過程,Controller中Action如何獲取參數、以及Action的返回值類型等內容。

更多內容可訪問我的個人博客:http://www.yunc.top/


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 恢復內容開始 每次講爬蟲的時候都會從“發送請求” 開始講,講到解析頁面的時候可能大部分讀者都會卡住,因為這部分確實需要一點XPATH或者CSS選擇器的前置知識。那麼有沒有不需要這麼複雜的操作就能把頁面信息讀取出來的方法呢? 答案是:有。 Lassie是一個超簡單的頁面信息檢索工具,它能夠通過幾行代碼 ...
  • 明天又雙叒叕是一年一度的七夕戀愛節了! 又是一波絕好的機會!恩愛秀起來! 購物車清空!禮物送起來!朋友圈曬起來! 等等! 什麼?! 你還沒準備好七夕禮物麽? 但其實你不知道要送啥? 原來又雙叒叕要到了 全民不知道送什麼禮物的系列日子了… 需要Python軟體工具和學習資料的小伙伴可以點擊下方鏈接自行 ...
  • 下載安裝 從 "https://golang.org/dl/" 下載最新的安裝包。 windows直接執行exe,按指示進行安裝(預設安裝目錄是:C:\Go) linxu解壓後複製到你喜歡目錄就行(一般放在:/usr/local/go) 配置環境變數 首先,應在全局環境變數里增加: ,指定 的安裝位 ...
  • Springcloud Aibaba現在這麼火,我一直想寫個基於Springcloud Alibaba一步一步構建微服務架構的系列博客,終於下定決心從今天開始本系列文章的第一篇 基礎環境準備。 該系列文章內容主要基於三個微服務:用戶服務 ,訂單服務 ,產品服務 用到的組件有: 註冊中心、配置中心 N ...
  • 關鍵詞:工作流定時任務 流程引擎定時任務設置 工作流系統定時任務配置 開源工作流引擎 開源工作流系統 一、定時任務的作用 發送郵件,發送簡訊。 處理節點自動執行的任務。比如:一個節點的待辦工作是機器執行的,需要等到滿足一定的條件才能運行下去,我們稱為自動執行任務節點,這個任務叫自動執行任務。 啟動定... ...
  • 這是Orleans團隊的帖子。Orleans是用於使用.NET構建分散式應用程式的跨平臺框架。有關更多信息,請參見 "https://github.com/dotnet/orleans" 。 我們很高興宣佈Orleans 3.0版本。自Orleans 2.0以來,進行了大量改進和修複,並提供了一些新 ...
  • 一、概述 1、通過反射可以提供類型信息,從而使得我們開發人員在運行時能夠利用這些信息構造和使用對象 2、反射機制允許程式在執行過程中動態地添加各種功能 二、運行時類型標識 1、運行時類型標誌(RTTI),可以在程式執行期間判斷對象類型。例如使用他能夠確切的知道基類引用指向了什麼類型對象。 2、運行時 ...
  • 在我們基於微信開發框架各種微信項目的時候,往往一個場景一個菜單集合,多個微信項目就可能存在多個不同的菜單組合。由於微信菜單的數量限制,我們想測試一下其他不同項目的菜單功能的時候,如果沒有一個很好的管理方案,就會顯得很麻煩,本篇隨筆介紹如何在管理微信菜單的基礎上增加一個菜單組的概念,以便隨時激活某個項... ...
一周排行
    -Advertisement-
    Play Games
  • Timer是什麼 Timer 是一種用於創建定期粒度行為的機制。 與標準的 .NET System.Threading.Timer 類相似,Orleans 的 Timer 允許在一段時間後執行特定的操作,或者在特定的時間間隔內重覆執行操作。 它在分散式系統中具有重要作用,特別是在處理需要周期性執行的 ...
  • 前言 相信很多做WPF開發的小伙伴都遇到過表格類的需求,雖然現有的Grid控制項也能實現,但是使用起來的體驗感並不好,比如要實現一個Excel中的表格效果,估計你能想到的第一個方法就是套Border控制項,用這種方法你需要控制每個Border的邊框,並且在一堆Bordr中找到Grid.Row,Grid. ...
  • .NET C#程式啟動閃退,目錄導致的問題 這是第2次踩這個坑了,很小的編程細節,容易忽略,所以寫個博客,分享給大家。 1.第一次坑:是windows 系統把程式運行成服務,找不到配置文件,原因是以服務運行它的工作目錄是在C:\Windows\System32 2.本次坑:WPF桌面程式通過註冊表設 ...
  • 在分散式系統中,數據的持久化是至關重要的一環。 Orleans 7 引入了強大的持久化功能,使得在分散式環境下管理數據變得更加輕鬆和可靠。 本文將介紹什麼是 Orleans 7 的持久化,如何設置它以及相應的代碼示例。 什麼是 Orleans 7 的持久化? Orleans 7 的持久化是指將 Or ...
  • 前言 .NET Feature Management 是一個用於管理應用程式功能的庫,它可以幫助開發人員在應用程式中輕鬆地添加、移除和管理功能。使用 Feature Management,開發人員可以根據不同用戶、環境或其他條件來動態地控制應用程式中的功能。這使得開發人員可以更靈活地管理應用程式的功 ...
  • 在 WPF 應用程式中,拖放操作是實現用戶交互的重要組成部分。通過拖放操作,用戶可以輕鬆地將數據從一個位置移動到另一個位置,或者將控制項從一個容器移動到另一個容器。然而,WPF 中預設的拖放操作可能並不是那麼好用。為瞭解決這個問題,我們可以自定義一個 Panel 來實現更簡單的拖拽操作。 自定義 Pa ...
  • 在實際使用中,由於涉及到不同編程語言之間互相調用,導致C++ 中的OpenCV與C#中的OpenCvSharp 圖像數據在不同編程語言之間難以有效傳遞。在本文中我們將結合OpenCvSharp源碼實現原理,探究兩種數據之間的通信方式。 ...
  • 一、前言 這是一篇搭建許可權管理系統的系列文章。 隨著網路的發展,信息安全對應任何企業來說都越發的重要,而本系列文章將和大家一起一步一步搭建一個全新的許可權管理系統。 說明:由於搭建一個全新的項目過於繁瑣,所有作者將挑選核心代碼和核心思路進行分享。 二、技術選擇 三、開始設計 1、自主搭建vue前端和. ...
  • Csharper中的表達式樹 這節課來瞭解一下表示式樹是什麼? 在C#中,表達式樹是一種數據結構,它可以表示一些代碼塊,如Lambda表達式或查詢表達式。表達式樹使你能夠查看和操作數據,就像你可以查看和操作代碼一樣。它們通常用於創建動態查詢和解析表達式。 一、認識表達式樹 為什麼要這樣說?它和委托有 ...
  • 在使用Django等框架來操作MySQL時,實際上底層還是通過Python來操作的,首先需要安裝一個驅動程式,在Python3中,驅動程式有多種選擇,比如有pymysql以及mysqlclient等。使用pip命令安裝mysqlclient失敗應如何解決? 安裝的python版本說明 機器同時安裝了 ...