前言
使用AngularJS的 $http
組件向 ASP.NET MVC 的 Web API 交互數(shù)據(jù)還是挺方便的肩袍,一般來說,使用$http
向后臺(tái) post
一個(gè)數(shù)據(jù)可以像這樣寫:
$http.post(url, product);
對(duì)應(yīng)的后臺(tái):
public IHttpActionResult PostProduct(Product product)
{
....
}
API 的后臺(tái)會(huì)自動(dòng)將(對(duì)象)參數(shù)中的值自動(dòng)對(duì)應(yīng)扒腕,供后續(xù)使用。
遇到的問題
不過今天遇到了一個(gè)稍顯復(fù)雜的場景,后臺(tái)需要接收另外一個(gè)參數(shù)吭净,而原有 Product
對(duì)應(yīng)的類又不能修改,怎么辦呢携取?第一時(shí)間想到的是把接口改為這樣:
public IHttpActionResult PostProduct(Product product, Category category)
{
....
}
不過很不幸攒钳,這樣不行,接口被調(diào)用的時(shí)候并沒有值傳過來雷滋!
<br />
對(duì)了不撑,補(bǔ)充一點(diǎn),前端相應(yīng)的要這么修改一下:
$http.post(url, { product: product, category: category });
好了晤斩,問題說明白了焕檬,同樣的場景,在 ViewController 中是可以正常的工作的澳泵,也就是接受多個(gè)參數(shù)实愚,而到了 Web API中就不好使了。
嘗試的方案
其實(shí)這樣的問題場景應(yīng)該很常見兔辅,所以Google一下腊敲,Stackoverflow中有很多解決方案,簡單看了一下维苔,不外乎以下幾種:
不過以上的方案代碼顯得不那么優(yōu)雅介时,甚至有些ugly了没宾,代碼就不貼了,感興趣可以自行搜索沸柔。
問題根源和解決方案
其實(shí)循衰,回過頭來思考一下,這個(gè)問題產(chǎn)生的原因其實(shí)很簡單:
ASP.NET Web API 遵循的是
RESTful Web API
設(shè)計(jì)風(fēng)格褐澎,也就是實(shí)現(xiàn)了CRUD
語義的接口会钝。從設(shè)計(jì)實(shí)現(xiàn)上來說微軟本身就是這么支持和實(shí)現(xiàn)的。
既然如此工三,那我們就從這點(diǎn)上來考慮顽素。
最基本的用法上咽弦,后臺(tái)接口是能接收復(fù)雜對(duì)象的,那么胁出,將多個(gè)參數(shù)放在一個(gè)對(duì)象里就解決了型型,在不修改原有哪些基礎(chǔ)類的前提下,定義一個(gè) Model
類全蝶,把幾個(gè)需要接受的參數(shù)類扔進(jìn)去就完事兒了闹蒜,代碼風(fēng)格也和原來相近,還是熟悉的味道抑淫。
public class Model
{
public Product product { get; set; }
public Category category { get; set; }
}
后臺(tái)代碼:
public IHttpActionResult PostProduct(Model model)
{
....
}
好了绷落,問題解決,我認(rèn)為這是一種比較科學(xué)的方案始苇,本身也符合 Web API 的常規(guī)使用習(xí)慣砌烁,代碼寫起來也不啰嗦。
最后的疑問催式,在新版的 ASP.NET MVC 中函喉, Web API 貌似和 ViewController 合并了,那么這個(gè)問題是不是就不存在了呢荣月?但愿如此管呵,要不問題就更復(fù)雜了...