一,Controller簡介

Controller擔任了資料傳遞的角色,負責流程控制,決定存取哪個Model以及決定顯示哪個View頁面,即ASP.NET MVC中有關於『傳遞』的任務皆由Controller負責。

Controller的執行階段負責呼叫執行Model中的資料處理,並把處理結果數據傳送到對應的View。

Controller即為一個Class類,類中包含很多Method方法,方法中進行流程處理。

Controller有以下特點:

  • 類必須是Public公開類
  • 類名稱必須以Controller結尾
  • 類必須繼承自ASP.NET MVC 的Controller類別
  • Controller中的Action方法必須是Public公開的

二,Controller執行過程

STEP1 接受請求

服務器接收到客戶端的請求

STEP2 執行路由

接收請求後,UrlRoutingModule組件逐一對比RouteTable裏面的Route後找到匹配的RouteData,進而根據路由數據決定對應的Controller和Action

STEP3 MVC請求處理程序

接著MVCRouteHandler處理器會建立MVCHandler傳送到RequestContext

STEP4 創建Controller

MVCHandler使用RequestContext來確認IcontrollerFactory,以用來建立Controller

STEP5 執行Controller

MVCHandler調用Controller出來執行

STEP6 調用Action

接著ControllerActionInvoker決定要取出Controller裏面的哪個Action

STEP7 執行Result

Action方法接受客戶端的輸入來得到結果,並根據回傳類型傳回結果

當Controller被MVCHandler選擇後,ActionInvoker根據路由參數選取對應的Action.

Ctrl+F5運行程序以後我們看到首頁:http://localhost:64570/

根據RouteConfig.cs中默認路由配置:

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

http://localhost:64570/ 根據上面的的默認路由配置把默認值補充完整就是http://localhost:64570/Home/Index,運行結果我們看到了index首頁

、Action選擇器

3-1:名稱選取器

運行專案,默認的名稱選擇器選擇Action,會取得HomeController中的Index:

    public ActionResult Index()
{
ViewBag.Message = "修改此範本即可開始著手進行您的 ASP.NET MVC 應用程式。"; return View();
}

現在我們在Action方法上面加上新的ActionName,添加對應新的View,如下

//添加ActionName
[ActionName("NewActionName")]
public ActionResult Index()
{
ViewBag.Message = "修改此範本即可開始著手進行您的 ASP.NET MVC 應用程式。"; return View();
}

運行以後默認首頁會顯示無法找到此頁面http://localhost:64570/home/index

修改請求的Action地址為:http://localhost:64570/home/NewActionName  頁面正常顯示為我們剛才添加的View頁面:

3-2:方法選擇器

1,NonAction屬性

Asp.net MVC中會把Controller中所有公開方法視為Action,如果我們想在Controller中建立包括公開屬性的不作為Action用途方法,可以通過NonAction屬性標記該方法:

    [NonAction]
public ActionResult Function()
{
ViewBag.Message = "修改此範本即可開始著手進行您的 ASP.NET MVC 應用程式。"; return View();
}

2,Http Action

Action 方法前加 Http Action屬性後,不同的Http請求(HttpPost,HttpGet,HttpHead,HttpPut...)就會跳轉到不同的Action方法。

例如:在Index前加上[HttpPost]後,只有post請求才會跳轉到此Action

     //[HttpPost]
public ActionResult Index()
{
ViewBag.Message = "修改此範本即可開始著手進行您的 ASP.NET MVC 應用程式。"; return View();
}

3-3:ActionResult

ActionResult是Action執行以後回傳的數據類型,就相當於方法中返回值是Void或者String,ActionResult的各種返回類型如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc; using System.Text;
using System.IO; namespace MvcApplication3.Controllers
{
public class HomeController : Controller
{
public ActionResult Index()
{
ViewBag.Message = "修改此範本即可開始著手進行您的 ASP.NET MVC 應用程式。"; return View();
} //添加ActionName
//[ActionName("NewActionName")]
//public ActionResult Index()
//{
// ViewBag.Message = "修改此範本即可開始著手進行您的 ASP.NET MVC 應用程式。"; // return View();
//} //添加ActionName
//[NonAction]
//public ActionResult Function()
//{
// ViewBag.Message = "修改此範本即可開始著手進行您的 ASP.NET MVC 應用程式。"; // return View();
//} //[HttpPost]
//public ActionResult Index()
//{
// ViewBag.Message = "修改此範本即可開始著手進行您的 ASP.NET MVC 應用程式。"; // return View();
//} ////-------------------------------以下是Action方法的各种回传类型-------------------- //1,ContextResult,回傳純文字文件
//public ContentResult About()
//{
//
// return Content("这是ContentResult的回传内容");
//} //2,EmptyResult 回傳null
//public EmptyResult About()
//{
// return null;
//} //3,RedirectResult ,相當於Response.Redirect導向新的鏈接
//public RedirectResult About()
//{
// //根据网址URL进行导向,可以链接到外部的网页
// //return Redirect("~/Home/Index");
// return Redirect("http://www.baidu.com");
//} //4,RedirectToRouteResult,根據路由進行導向
//public RedirectToRouteResult About()
//{
// 只能導向一個專案下面的Controller Action
// return RedirectToAction("Index", "Home", null);
//} //5, ViewResult 回傳一個檢視結果
//public ViewResult About()
//{
// //所載入的View可以進行母板頁面的選擇或者設置無模板頁面
// return View();
//} //6,PartialViewResult 回傳部分檢視,不能加載模板頁面
//public PartialViewResult About()
//{
// return PartialView();
//} //7,回傳一個未經授權的錯誤
//public HttpUnauthorizedResult About()
//{
// return new HttpUnauthorizedResult(); // //webConfig中配置了未經授權錯誤發生的時候,重新導向的Url,如下
// // <authentication mode="Forms">
// // <forms loginUrl="~/Account/Login" timeout="2880" />
// //</authentication>
//} //8,HttpNotFoundResult
//public HttpNotFoundResult About()
//{
// return HttpNotFound("Page No Found");
//} //9,JavaScriptResult,本質上是回傳文字內容,知識Response.ContentType被定義為application/x-javascript
//public JavaScriptResult About()
//{
// string js = "alert(\"這是JavaScriptResult回傳結果\")";
// return JavaScript(js);
//} //10,JsonResult,ASP.NET MVC將Response.ContentType定義為application/json
// 並通過JavaScriptSerializer把回傳的物件序列化成Json字串
//public JsonResult About()
//{
// var jsonContent = new {
// Id=1,
// Text="這是JsonResult內容"
// };
// return Json(jsonContent,JsonRequestBehavior.AllowGet);
//} //11,FilePathResult,通過路徑傳送檔案到客戶端
//public FilePathResult About()
//{
// //Server的MapPath方法產生指定的檔案路徑
// var imagePath = Server.MapPath("../Images/example.jpg");
// //回傳檔案
// return File(imagePath, "image/jpeg");
//} //12, FileContentResult , 回傳檔案內容,通過二進制的方式進行傳遞
// 範例中,把字符串轉換成編碼資料,然後傳入File方法中進行回傳
//public FileContentResult About()
//{
// //使用Encoding把資料以UTF8編碼轉換
// byte[] data = Encoding.UTF8.GetBytes("FileContentResult範例");
// //File(byte[] 檔案資料,檔案類型,下載時檔案名稱)
// return File(data,"text/plain","example.txt");
//} //13,FileStreamResult 回傳檔案內容,通過Stream的方式進行傳遞
// 範例中,用Server的MapPath方法產生指定檔案的url,然後開啟檔案的FileStream傳入File方法中進行回傳
//public FileStreamResult About()
//{
// //獲取檔案路徑
// var path = Server.MapPath("../Images/example.txt");
// //使用FileStream開啟檔案
// var fileStream = new FileStream(path, FileMode.Open);
// //File方法回傳
// return File(fileStream,"text/plain","example.txt");
//} //14,ActionResult,上述所有的類別都直接或間接繼承自ActionResult,所以上述方法都可以用在ActionResult上
//所以ActionResult回傳結果比較廣泛
//public ActionResult About()
//{
// if (new Random().Next()%2==0)
// {
// //回傳ViewResult
// return View();
// }
// else
// {
// //回傳JsonResult
// return Json(null,JsonRequestBehavior.AllowGet);
// }
//} public ActionResult Contact()
{
ViewBag.Message = "您的連絡頁面。"; return View();
}
}
}

ASP.NET MVC 4.0 学习5-ActionResult的更多相关文章

  1. ASP.NET MVC 4.0 学习6-Model Binding

    一,ViewData,ViewBag與TempData ASP.NET MVC架構中,通過繼承在Controller中的ViewData,ViewBag和TempData和View頁面進行資料的存取, ...

  2. ASP.NET MVC 4.0 学习2-留言板實現

    新增專案實現留言板功能,瞭解MVC的運行機制 1,新增專案   2,添加數據庫文件message.mdf   Ctrl+W,L 打開資料庫連接,添加存放留言的Atricle表 添加字段,後點擊&quo ...

  3. ASP.NET MVC 4.0 学习1-C#基础语法

    1,方法多載,相同的方法名稱,不同的參數類型.數量 class Program { static void Main(string[] args) { Program newObject = new ...

  4. ASP.NET MVC 4.0 学习3-Model

    Model負責獲取數據庫中的資料,並對數據庫中的數據進行處理. MVC中有關 數據庫 的任務都由Model來完成,Model中對數據資料進行定義,Controller和View中都會參考到Model, ...

  5. ASP.NET MVC 4.0 学习4-Code First

    之前我們需要用到的數據,通過添加Entity實體數據模型把數據庫中需要的Database拉到項目中如下圖, 而就是Code First就是相對於這種處理數據的方法而言的 Code First更加準確的 ...

  6. 从零开始学习ASP.NET MVC 1.0

    转自:http://www.cnblogs.com/zhangziqiu/archive/2009/02/27/ASPNET-MVC-1.html <从零开始学习ASP.NET MVC 1.0& ...

  7. 系列文章--从零开始学习ASP.NET MVC 1.0

    从零开始学习ASP.NET MVC 1.0 (一) 开天辟地入门篇 从零开始学习 ASP.NET MVC 1.0 (二) 识别URL的Routing组件 从零开始学习 ASP.NET MVC 1.0 ...

  8. 2.第一个ASP.NET MVC 5.0应用程序

    大家好,上一篇对ASP.NET MVC 有了一个基本的认识之后,这一篇,我们来看下怎么从头到尾创建一个ASP.NET MVC 应用程序吧.[PS:返回上一篇文章:1.开始学习ASP.NET MVC] ...

  9. ASP.NET MVC 3.0 Controller基础

    ASP.NET MVC 3.0 Controller基础   1.Controller类与方法 Controller(控制器)是ASP.NET MVC的核心,负责处理浏览器请求,并作出响应.Cotro ...

随机推荐

  1. Java学习笔记--泛型

    一个泛型类就是具有一个或者多个类型变量的类. 我们可以只关注泛型,而不会为数据存储的细节而烦恼 . java泛型(一).泛型的基本介绍和使用 http://blog.csdn.net/lonelyro ...

  2. Mysqldump记录

    MySql导出特定的一段记录(导出为SQL语句) mysqldump –u root -p 数据库名 表名 --where=" author like '%Joking%' " & ...

  3. 手把手教你清除WIN7的C盘垃圾

    WIN7系统用着用着C盘会变得越来越大,可用空间变得越来越小,磁盘清理,和安全卫士怎么清也清不出这些系统深度的垃圾.我们可以手动删除,释放C盘空间. 这样一清理下来,结果我的C盘就释放了近10个GB的 ...

  4. Windows 8.1 Update1 6610 32位/64位下载、安装和新增功能简评

    今天,微软已经确认完成Windows 8.1 2014 Update RTM正式版的开发工作,累计修复99%的已知bug.随后,微软会将Win8.1首个春季更新正式版,即Win8.1 2014 Upd ...

  5. PowerShell3.0中,所有的命令

    Get-Command * >> cmd.txt CommandType Name ModuleName ----------- ---- ---------- Alias % -> ...

  6. libusb-win32 在visual studio2008中成功编译回忆录

    关于这个项目不用多说 介绍 libusb是一个针对usb通讯的库. 使用它, 你不需要知道操作系统的细节, 你只需要对USB有足够的了解即可. 它也不需要你写驱动, 所有的工作都可以在用户态完成. 使 ...

  7. bzoj1620 [Usaco2008 Nov]Time Management 时间管理

    Description Ever the maturing businessman, Farmer John realizes that he must manage his time effecti ...

  8. c++ 02

    一.堆内存的动态分配与释放 malloc/calloc/realloc/free new/delete:详见memory.cpp 1.通过new运算符分配单个变量 数据类型* 指针变量 = new 数 ...

  9. MySQL数据库配置主从服务器实现双机热备

    转自:http://www.cnblogs.com/cchun/p/3712637.html 一.安装MySQL 说明:在两台MySQL服务器192.168.21.169和192.168.21.168 ...

  10. vs2008如何创建DLL和使用DLL

    一 动态库的编译 文件->新建->项目 选择下一步:然后在应用程序类型里选择DLL 在test项目的头文件里加上test.h;并添加下列代码 在test.cpp里增加如下代码 然后F7编译 ...