ASP.NET WebAPI 04 Model綁定

來源:互聯網
上載者:User

標籤:

 

在前面的幾篇文章中我們都是採用在URI中中繼資料類型進行傳參,實際上ASP.NET Web API也提供了對URI進行複雜參數的綁定方式--Model綁定。這裡的Model可以簡單的理解為目標Anction方法的某個參數。

eg:

public Figure GetFigureFromQueryString([ModelBinder]Figure figure)

{

return figure;

}

請求url: http://localhost:4044/api/Figure/GetFigureFromQueryString?FirstName=Bran&LastName=Stack

結果:

{

"FirstName": "Bran",

"LastName": "Stack"

}

 

(本篇為了更好的體現綁定結果,所有Anction的返回結果都是請求參數或整合的後的請求參數)

 

ModelBinder

在之前的文章中多次提到URI的資料主要來源於兩種方式:Route,QueryString。但是URI只提供簡單的基礎資料類型,在上面的例中,我們會發現參數變成了類。ModelBinderAttribute提供了基礎資料類型向複雜類型資料轉換的功能。

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Parameter, Inherited = true, AllowMultiple = false)]

public class ModelBinderAttribute : ParameterBindingAttribute

{

}

 

從定義中我們可以看出ModelBinder的AttributeUsage可以看出來ModelBinder可以用於類型與參數。下面我就列舉一些Model綁定的形式。

 

  1. 簡單類

這裡所說的簡單類是指資料是指類的公開屬性是基礎資料類型。比如我們之前一直使用的Figure類。

public class Figure

{

public string FirstName { get; set; }

public string LastName { get; set; }

}

 

還是以本文開始的GetFigureFromQueryString([ModelBinder]Figure figure) 為例。因為該Action中只採用了一個參數。所以在傳參的過程中只需要將FirstName,LastName作為QueryString傳遞,ModelBinder將轉換出Figure對象。

http://localhost:4044/api/Figure/GetFigureFromQueryString?FirstName=Bran&LastName=Stack

 

同時我們也可以採用route形式進行傳參:

[Route("GetFigureFromRoute/{FirstName}/{LastName}")]

public Figure GetFigureFromRoute(Figure figure)

url:

http://localhost:4044/api/Figure/GetFigureFromRoute/Bran/Stack

 

當然以此類推也也可以進行混合的傳參:

還是基於 GetFigureFromRoute Action

我們用以下url進行訪問:

http://localhost:4044/api/Figure/GetFigureFromRoute/Bran/Stack?FirstName=Robb

 

那我們得到的結果將是:

{

"FirstName": "Robb",

"LastName": "Stack"

}

 

由此可以看出

QueryString參數的優先順序是高於Route參數的

 

2.多參數(簡單類)

第一種情況我們是考慮了一個參數,現在我們把參數變成兩個,如下:

List<Figure> 方法名 (Figure a, Figure b)

因為這個時候出現了兩個類型相同的參數,僅靠屬性名稱已經不能對參數進行區別。這個時候WebAPI為我們提供了首碼形式對參數進行區分。下面就以Route的方式做一demo:、

 

[Route("GetTwoFigureFromRoute/{a.FirstName}/{a.LastName}/{b.FirstName}/{b.LastName}")]

public List<Figure> GetTwoFigureFromRoute(Figure a, Figure b)

我們對路由進行一個簡單分析:即{參數名}.{屬性名稱} 作為路由的key

{a.FirstName}:參數a的FirstName屬性

{a.LastName}:參數a的LastName屬性

{b.FirstName}:參數b的FirstName屬性

{b.LastName}:參數b的LastName屬性

用以下url訪問

http://localhost:4044/api/Figure/GetTwoFigureFromRoute/Bran/Stack/Robb/Stack

得到的結果就是:

[

{

"FirstName": "Bran",

"LastName": "Stack"

},

{

"FirstName": "Robb",

"LastName": "Stack"

}

]

 

對於QueryString形式傳參也非常簡單,直接將{參數名}.{屬性名稱} 作為QueryString的key.比如:

public List<Figure> GetTwoFigureFromQueryString(Figure a, Figure b)

url:

http://localhost:4044/api/Figure/GetTwoFigureFromQueryString?a.FirstName=Bran&a.LastName=Stack&b.FirstName=Robb&b.LastName=Stack

將得到如Route形式一樣的結果

 

 

3.複雜類

現在我們對Figure添加一個Direwolf類的屬性Direwolf,讓其變為一個複雜類

public class Figure

{

public Direwolf Direwolf { get; set; }

}

 

public class Direwolf

{

public string Name { get; set; }

public string Color { get; set; }

}

在傳參數的過程中顯然我們不能對直接對Direwolf屬性賦值,所以我們要對Direwolf屬性進行拆分,這個時候我也要用到首碼的方式進行傳參。如下:

public Figure GetComplexFigureFromQueryString(Figure figure)

url:

http://localhost:4044/api/Figure/GetComplexFigureFromQueryString?FirstName=Jon&LastName=Snow&Direwolf.Color=White&Direwolf.Name=Summer

結果:

{

"FirstName": "Bran",

"LastName": "Stack",

"Direwolf": {

"Name": "Summer",

"Color": "White"

}

}

 

對於Route形式也是一樣:

[Route("GetComplexFigureFromRoute/{FirstName}/{LastName}/{Direwolf.Name}/{Direwolf.Color}")]

public Figure GetComplexFigureFromRoute(Figure figure)

 

url:

http://localhost:4044/api/Figure/GetComplexFigureFromRoute/Bran/Stack/Grey/Summer

 

對於多參數的形式也照樣可以處理:

public List<Figure> GetTwoComplexFigureFromQueryString(Figure a, Figure b)

url:

http://localhost:4044/api/Figure/GetTwoComplexFigureFromQueryString?a.FirstName=Bran&a.LastName=Stack&a.Direwolf.Color=Grey&a.Direwolf.Name=Summer&b.FirstName=Jon&b.LastName=Snow&b.Direwolf.Color=White&b.Direwolf.Name=Ghost

 

4.集合類型

集合類型因為存在長度的確定性,所以還是需要通過首碼的方式去指定序號,如下:

public List<int> GetList([ModelBinder] List<int> list)

{

return list;

}

 

url:

http://localhost:4044/api/Figure/GetList?[0]=0&[1]=1&[2]=2&[3]=3

結果:

[

0,

1,

2,

3

]

 

注意

序號必須是從0開始連續的整數,不然就只能得到序號斷裂之前的資料,如:

url:

http://localhost:4044/api/Figure/GetList?[0]=0&[2]=1&[2]=2&[3]=3

 

結果:

[

0

]

 

另外,如果要採用Route形式的傳參方式,就必須考慮資料的長度問題。

 

 

5字典類型

WebAPI在資料字典類型的先將資料轉化成KeyValuePair的集合類型,再轉化成字典類型。所以再傳參的時候我們可以採用與集合類型一致的方式。如:

public Dictionary<string, int> GetDictionary([ModelBinder]Dictionary<string, int> dic)

url:

http://localhost:4044/api/Figure/GetDictionary?[0].Key=a&[0].Value=1&[1].Key=b&[1].Value=2

結果

{

"a": 1,

"b": 2

}

 

源碼

Github: https://github.com/BarlowDu/WebAPI (API_4)

ASP.NET WebAPI 04 Model綁定

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.