0%

Agenda

前言

上篇得知MVC預設透過DefaultControllerFactory反射方式動態建立Controller物件

本篇會分享我們常用到Controller基礎類別和相關物件.

我有做一個可以針對於Asp.net MVC Debugger的專案,只要下中斷點就可輕易進入Asp.net MVC原始碼.

ControllerBase(Controller基礎類別)

ControllerBase具有如下幾個重要的屬性

  1. TempData:將設置資料存於Session中,生命週期除了當下請求, 導頁後仍可續存.
  2. ViewBag:儲存Controllerview傳遞資料或變數 (型別dynamic)
  3. ViewData:儲存Controllerview傳遞資料或變數 (型別ViewDataDictionary)

雖說ViewBagViewData看起來使用不同的物件,但從程式碼了解到其實ViewBag也是使用ViewData引用.

Read more »

Agenda

前言

上篇得知MVC預設透過DefaultControllerFactory反射方式動態建立Controller物件

本篇會分享我們常用到Controller基礎類別和相關物件.

我有做一個可以針對於Asp.net MVC Debugger的專案,只要下中斷點就可輕易進入Asp.net MVC原始碼.

ControllerBase(Controller基礎類別)

ControllerBase具有如下幾個重要的屬性

  1. TempData:將設置資料存於Session中,生命週期除了當下請求, 導頁後仍可續存.
  2. ViewBag:儲存Controllerview傳遞資料或變數 (型別dynamic)
  3. ViewData:儲存Controllerview傳遞資料或變數 (型別ViewDataDictionary)

雖說ViewBagViewData看起來使用不同的物件,但從程式碼了解到其實ViewBag也是使用ViewData引用.

Read more »

Agenda

前言

前篇介紹MVC使用HttpHandlerMvcHandler透過並MvcRouteHandler物件來返回.

relationship_pic.PNG

我有做一個可以針對於Asp.net MVC Debugger的專案,只要下中斷點就可輕易進入Asp.net MVC原始碼.

大家介紹如何取得Controller執行物件

取得執行Controller

ProcessRequest方法是透過ProcessRequestInit取得執行controller物件,讓我們看看是這個方法如何controller物件.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
private void ProcessRequestInit(HttpContextBase httpContext, out IController controller, out IControllerFactory factory)
{
HttpContext currentContext = HttpContext.Current;
if (currentContext != null)
{
bool? isRequestValidationEnabled = ValidationUtility.IsValidationEnabled(currentContext);
if (isRequestValidationEnabled == true)
{
ValidationUtility.EnableDynamicValidation(currentContext);
}
}

AddVersionHeader(httpContext);
RemoveOptionalRoutingParameters();

// Get the controller type
string controllerName = RequestContext.RouteData.GetRequiredString("controller");

// Instantiate the controller and call Execute
factory = ControllerBuilder.GetControllerFactory();
controller = factory.CreateController(RequestContext, controllerName);
if (controller == null)
{
throw new InvalidOperationException(
String.Format(
CultureInfo.CurrentCulture,
MvcResources.ControllerBuilder_FactoryReturnedNull,
factory.GetType(),
controllerName));
}
}
Read more »

Agenda

前言

前篇介紹MVC使用HttpHandlerMvcHandler透過並MvcRouteHandler物件來返回.

relationship_pic.PNG

我有做一個可以針對於Asp.net MVC Debugger的專案,只要下中斷點就可輕易進入Asp.net MVC原始碼.

大家介紹如何取得Controller執行物件

取得執行Controller

ProcessRequest方法是透過ProcessRequestInit取得執行controller物件,讓我們看看是這個方法如何controller物件.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
private void ProcessRequestInit(HttpContextBase httpContext, out IController controller, out IControllerFactory factory)
{
HttpContext currentContext = HttpContext.Current;
if (currentContext != null)
{
bool? isRequestValidationEnabled = ValidationUtility.IsValidationEnabled(currentContext);
if (isRequestValidationEnabled == true)
{
ValidationUtility.EnableDynamicValidation(currentContext);
}
}

AddVersionHeader(httpContext);
RemoveOptionalRoutingParameters();

// Get the controller type
string controllerName = RequestContext.RouteData.GetRequiredString("controller");

// Instantiate the controller and call Execute
factory = ControllerBuilder.GetControllerFactory();
controller = factory.CreateController(RequestContext, controllerName);
if (controller == null)
{
throw new InvalidOperationException(
String.Format(
CultureInfo.CurrentCulture,
MvcResources.ControllerBuilder_FactoryReturnedNull,
factory.GetType(),
controllerName));
}
}
Read more »

Agenda

前言

前一篇介紹路由封裝了Http請求路徑資訊可以讓我們找到相對應的ActionController並呼叫執行外,也可透過MapPageRoute來將請求教給.aspx實體檔案來處理請求.

Route甚至可以讓我們自己客製化處理HttpHandler 在Route中建立處理客製化HttpHandler可謂很有彈性

本篇介紹Route物件建立MvcRouteHandler物件且如何取到IHttpHandler.

我有做一個可以針對於Asp.net MVC Debugger的專案,只要下中斷點就可輕易進入Asp.net MVC原始碼.

MVC取得使用HttpHandler (IHttpHandler)

之前說到我們透過MapRoute擴展方法加入一個Route物件給RouteCollection全域路由集合.

Route使用的IRouteHandler介面是由MvcRouteHandler來實現

Read more »

Agenda

前言

前一篇介紹路由封裝了Http請求路徑資訊可以讓我們找到相對應的ActionController並呼叫執行外,也可透過MapPageRoute來將請求教給.aspx實體檔案來處理請求.

Route甚至可以讓我們自己客製化處理HttpHandler 在Route中建立處理客製化HttpHandler可謂很有彈性

本篇介紹Route物件建立MvcRouteHandler物件且如何取到IHttpHandler.

我有做一個可以針對於Asp.net MVC Debugger的專案,只要下中斷點就可輕易進入Asp.net MVC原始碼.

MVC取得使用HttpHandler (IHttpHandler)

之前說到我們透過MapRoute擴展方法加入一個Route物件給RouteCollection全域路由集合.

Route使用的IRouteHandler介面是由MvcRouteHandler來實現

Read more »

Agenda

前言

現在開始進入Asp.net MVC原始碼世界,我們從路由開始切入一步一步進入MVC核心.

我有做一個可以針對於Asp.net MVC Debugger的專案,只要下中斷點就可輕易進入Asp.net MVC原始碼.

如下面動畫

介紹Route

每個HTTP請求MVC使用路由的目標是ControllerAction,不像ASP.NET Web Form處理物理文件(.aspx文件),要執行ControllerAction名稱包含在HTTP請求中,ASP.NET MVC需要通過解析HTTP請求得到正確的ControllerAction的名稱。

使用Route處理物理文件有以下幾個優勢:

Read more »

Agenda

前言

現在開始進入Asp.net MVC原始碼世界,我們從路由開始切入一步一步進入MVC核心.

我有做一個可以針對於Asp.net MVC Debugger的專案,只要下中斷點就可輕易進入Asp.net MVC原始碼.

如下面動畫

介紹Route

每個HTTP請求MVC使用路由的目標是ControllerAction,不像ASP.NET Web Form處理物理文件(.aspx文件),要執行ControllerAction名稱包含在HTTP請求中,ASP.NET MVC需要通過解析HTTP請求得到正確的ControllerAction的名稱。

使用Route處理物理文件有以下幾個優勢:

Read more »

Agenda

前言:

前面幾篇文章已經詳細分享解說Asp.net如何透過HttpApplication找到IHttpHandler並執行呼叫介面方法.

瀏覽器請求IIS流程

今天要跟大家分享上圖的最後一塊拼圖揭密並探索Asp.net MVC使用的IHttpHandler.

UrlRoutingModule-4.0

在標題已經透漏我們是透過UrlRoutingModule這個繼承IHttpModule的類別來取得IHttpHandler

有人可能會有疑問是我明明沒有註冊此HttpModule Asp.net怎麼知道的呢?

原因是這個Module是預設就載入

Read more »

Agenda

前言:

前面幾篇文章已經詳細分享解說Asp.net如何透過HttpApplication找到IHttpHandler並執行呼叫介面方法.

瀏覽器請求IIS流程

今天要跟大家分享上圖的最後一塊拼圖揭密並探索Asp.net MVC使用的IHttpHandler.

UrlRoutingModule-4.0

在標題已經透漏我們是透過UrlRoutingModule這個繼承IHttpModule的類別來取得IHttpHandler

有人可能會有疑問是我明明沒有註冊此HttpModule Asp.net怎麼知道的呢?

原因是這個Module是預設就載入

Read more »