ASP.NET Web API如何接受来自AngualrJS的QueryString呢?本篇体验两种方式。前端
第一种方式:http://localhost:49705/api/products?search=GDN后端
这种方式是QueryString原生的格式。api
首先,把当前的域名和端口号放到一个自定义的module中去。app
1 (function () { 2 "use strict"; 3 4 angular.module("custommodule", ["ngResource"]) 5 .constant("appSettings", { 6 serverPath: "http://localhost:49705/" 7 }); 8 }());
以上,依赖ngResource这个module,这个module在angular-resource.js文件中,注意须要引用该文件。this
接着,经过factory的方式为custommodule建立一个自定义service。spa
(function () { "use strict"; //经过工厂的方式建立了一个服务 angular.module("custommodule") .factory("productResource", ["$resource", "appSettings", productResouce]); function productResouce($resource, appSettings) { return $resource(appSettings.serverPath + "/api/products"); } }());
以上,productResource这个服务返回的是经$resource封装的完整的API请求路径。code
如今,某个controller须要使用productResource这个服务。server
(function () { "use strict"; angular .module("productManagement") .controller("ProductListCtrl", ProductListCtrl); function ProductListCtrl(productResource) { var vm = this; vm.searchCriteria = "GDN"; productResource.query({search: vm.searchCriteria},function (data) { vm.products = data; }); } }());
以上,从前端传来名称为search的QueryString。blog
后端ASP.NET Web API中,action方法的形参名称必须也是search。路由
public IEnumerable<Product> Get(string search) { var productRepository = new ProductRepository(); var products = productRepository.Retrieve(); return products.Where(p => p.ProductCode.Contains(search)); }
WebApiConfig类对应的设置为:
config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional } );
此时,前端是以http://localhost:49705/api/products?search=GDN这种方式请求数据的。
若是咱们想以http://localhost:49705/api/products/GDN这种方式请求数据呢?
第二种方式:http://localhost:49705/api/products/GDN
这种方式须要作一些路由设置。
须要让AngularJS知道,在products/后面的这个位置传的值是赋值给search这个QueryString的。
也要让ASP.NET Web API知道,当读取products/后面的这个值后,是要赋值给路由中的search这个变量的。
如何让AngularJS的路由符合格式呢?
function productResouce($resource, appSettings) { return $resource(appSettings.serverPath + "/api/products/:search"); }
如何让ASP.NET Web API的路由同AngualrJS对应起来呢?
首先,要在路由中容许有search这个QueryString。
config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{search}", defaults: new { search = RouteParameter.Optional } );
而后,在Action方法中接受search这个QueryString。
public IEnumerable<Product> Get(string search) { var productRepository = new ProductRepository(); var products = productRepository.Retrieve(); return products.Where(p => p.ProductCode.Contains(search)); }
这时候,前端是以http://localhost:49705/api/products/GDN这种方式请求的。
总结:
● 若是是想获取默认状况下的QueryString,只须要保证先后段的查询变量一致就行了,好比这里的search
● 若是想获取/等自定义格式下的QueryString,前端AngualrJS须要以相似/api/products/:search这样的方式定义路由,后端ASP.NET Web API中也须要把search做为路由中的一个变量,在config.Routes.MapHttpRoute方法中设置