0%

Agenda

前言

不知道大家有沒有點暈頭轉向XD,MVCModel綁定機制真的蠻複雜,希望大家有跟上來

透過DefaultModelBinderBindComplexElementalModel方法綁定複雜模型的值.

BindProperty方法時填充子節點ModelMetadataModel屬性,透過(DefaultModelBinder)再次綁定物件動作如下

  • ModelMetadata是簡單模型就會把值填充給此次ModelMetadata.Model
  • ModelMetadata是複雜模型就建立一個物件後呼叫BindProperty直到找到最後的簡單模型.

BindComplexElementalModel方法做幾個主要動作

  1. BindProperties:透過MetaData取得屬性資訊並利用反射把值添加上去.
  2. OnModelUpdated:找尋ModelMetaDataModelValidator進行屬性驗證,如果驗證失敗會把資料資訊加到ModelState.AddModelError(ModelStateDictionary)可在View搭配顯示error訊息
1
2
3
4
5
6
7
8
9
10
internal void BindComplexElementalModel(ControllerContext controllerContext, ModelBindingContext bindingContext, object model)
{
ModelBindingContext newBindingContext = CreateComplexElementalModelBindingContext(controllerContext, bindingContext, model);

if (OnModelUpdating(controllerContext, newBindingContext))
{
BindProperties(controllerContext, newBindingContext);
OnModelUpdated(controllerContext, newBindingContext);
}
}
Read more »

Agenda

前言

不知道大家有沒有點暈頭轉向XD,MVCModel綁定機制真的蠻複雜,希望大家有跟上來

透過DefaultModelBinderBindComplexElementalModel方法綁定複雜模型的值.

BindProperty方法時填充子節點ModelMetadataModel屬性,透過(DefaultModelBinder)再次綁定物件動作如下

  • ModelMetadata是簡單模型就會把值填充給此次ModelMetadata.Model
  • ModelMetadata是複雜模型就建立一個物件後呼叫BindProperty直到找到最後的簡單模型.

BindComplexElementalModel方法做幾個主要動作

  1. BindProperties:透過MetaData取得屬性資訊並利用反射把值添加上去.
  2. OnModelUpdated:找尋ModelMetaDataModelValidator進行屬性驗證,如果驗證失敗會把資料資訊加到ModelState.AddModelError(ModelStateDictionary)可在View搭配顯示error訊息
1
2
3
4
5
6
7
8
9
10
internal void BindComplexElementalModel(ControllerContext controllerContext, ModelBindingContext bindingContext, object model)
{
ModelBindingContext newBindingContext = CreateComplexElementalModelBindingContext(controllerContext, bindingContext, model);

if (OnModelUpdating(controllerContext, newBindingContext))
{
BindProperties(controllerContext, newBindingContext);
OnModelUpdated(controllerContext, newBindingContext);
}
}
Read more »

Agenda

前言

CachedDataAnnotationsMetadataAttributes這個類別攔截某些標籤可被攔截驗證.

本篇會介紹另一個可以客製化驗證ValidationAttribute,常用驗證標籤並講述是如何參數屬性是如何取得這個標籤和使用過程.

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

ValidationAttribute

ValidationAttribute類別在System.ComponentModel.DataAnnotations命名空間下.

我們可以建立一個類別繼承ValidationAttributebool IsValid(object value)重載方法來製做我們客制化驗證機制.

IsValid方法有一個Bool回傳值回傳true代表驗證通過false反之

Read more »

Agenda

前言

CachedDataAnnotationsMetadataAttributes這個類別攔截某些標籤可被攔截驗證.

本篇會介紹另一個可以客製化驗證ValidationAttribute,常用驗證標籤並講述是如何參數屬性是如何取得這個標籤和使用過程.

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

ValidationAttribute

ValidationAttribute類別在System.ComponentModel.DataAnnotations命名空間下.

我們可以建立一個類別繼承ValidationAttributebool IsValid(object value)重載方法來製做我們客制化驗證機制.

IsValid方法有一個Bool回傳值回傳true代表驗證通過false反之

Read more »

Agenda

前言

上一篇有介紹ModelMetadata和參數Model之間的關係.

UML_Model

MVC提供我們一個IMetadataAware介面,讓我們可以對最終生成ModelMetadata進行自由設定.

IMetadataAware介面

IMetadataAware介面有一個OnMetadataCreated方法

1
2
3
4
public interface IMetadataAware
{
void OnMetadataCreated(ModelMetadata metadata);
}

MVC有預設兩個實現IMetadataAware介面的標籤.

Read more »

Agenda

前言

上一篇有介紹ModelMetadata和參數Model之間的關係.

UML_Model

MVC提供我們一個IMetadataAware介面,讓我們可以對最終生成ModelMetadata進行自由設定.

IMetadataAware介面

IMetadataAware介面有一個OnMetadataCreated方法

1
2
3
4
public interface IMetadataAware
{
void OnMetadataCreated(ModelMetadata metadata);
}

MVC有預設兩個實現IMetadataAware介面的標籤.

Read more »

Agenda

前言

IValueProvider物件透過一個ValueProviderFactory工廠來產生

Action方法綁定Model参数由實現IModelBinder的介面ModelBinder(DefaultModelBinder)物件來實現

IModelBinder介面中有一個重要的方法object BindModel取得Model參數資料.

但在Http請求傳送參數極為複雜是如何將參數動態綁定在Action參數上呢?

最常見的Json參數透過POST Body傳到AP端,經由MVC BindModel來取得參數物件資料.

如下方資料.

1
2
3
4
5
{
"Key":"123",
"value":"",
"Adress":["test133","e2424"]
}
Read more »

Agenda

前言

IValueProvider物件透過一個ValueProviderFactory工廠來產生

Action方法綁定Model参数由實現IModelBinder的介面ModelBinder(DefaultModelBinder)物件來實現

IModelBinder介面中有一個重要的方法object BindModel取得Model參數資料.

但在Http請求傳送參數極為複雜是如何將參數動態綁定在Action參數上呢?

最常見的Json參數透過POST Body傳到AP端,經由MVC BindModel來取得參數物件資料.

如下方資料.

1
2
3
4
5
{
"Key":"123",
"value":"",
"Adress":["test133","e2424"]
}
Read more »

Agenda

前言

MVCModel-Binding建立複雜物件(牽扯到複雜模型綁定.)

這篇會跟大家介紹MVC是如何把達成這個複雜的動作

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

IModelBinder(DefaultModelBinder)

DefaultModelBinder將Http請求傳來資料轉換為強型別物件,DefaultModelBinder是如何取得使用Model資料呢?

實現IValueProvider來處理。

ModelBinders

Read more »

Agenda

前言

MVCModel-Binding建立複雜物件(牽扯到複雜模型綁定.)

這篇會跟大家介紹MVC是如何把達成這個複雜的動作

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

IModelBinder(DefaultModelBinder)

DefaultModelBinder將Http請求傳來資料轉換為強型別物件,DefaultModelBinder是如何取得使用Model資料呢?

實現IValueProvider來處理。

ModelBinders

Read more »