ASP.NET WebAPI 路由规则与POST数据
2016-01-07 00:50
489 查看
蛋疼的路由规则约定
我们为controller程序增加一个GetProducts方法
让这个方法与GetAllProducts方法逻辑一致
再运行程序,
发现前端AJAX已经无法正常获取数据了
对于AJAX请求
服务端返回如下内容
Multiple actions were found that match the request:
System.Collections.Generic.IEnumerable`1[HelloWebAPI.Models.Product] GetAllProducts() on type HelloWebAPI.Controllers.ProductsController\r\nSystem.Collections.Generic.IEnumerable`1[HelloWebAPI.Models.Product] GetProducts() on type HelloWebAPI.Controllers.ProductsController
也就是说
有两个同样的action满足这个请求( $.getJSON("api/products/",………..)
如果你尝试把Action名字加在请求的路径当中
比如$.getJSON("api/products/GetProducts/"….
那么就会得到这样的反馈:
"The parameters dictionary contains a null entry for parameter 'id' of non-nullable type 'System.Int32' for method 'HelloWebAPI.Models.Product GetProductById(Int32)' in 'HelloWebAPI.Controllers.ProductsController'. An optional parameter must be a reference type, a nullable type, or be declared as an optional parameter."
也就是说这个请求与
GetProductById(int id)
这个Action冲突了!
查阅微软说明得知:
在Web API的controller当中
只要方法名以“Get”开头
就会匹配所有的Get请求
同理以Post开头的方法
将匹配所有的Post请求
(目前我个人认为这是一个非常蛋疼的约定!!!)
(小尾鱼也这么认为)
插播一句
VS2012中注释与取消注释的快捷图标改成这样
也是非常蛋疼的改变!还以为是要插入个tip框!
接收POST请求
我们为实例中的controller增加一个方法
这个方法接收一个Product实体
这个实体是POST来的数据自动序列化得来的
这个工作是由WEB API完成的
在客户端POST数据的js代码如下:
前端传递的JSON对象,在ACTION中被序列化为实体类型。
如下图:
好吧,假设我们没有一个类型与传递的json对象相对应
该如何是好呢?
我首先想到的是把参数改成string类型的
但string类型的参数并不能接收到任何内容
如下图所示
看来我的想法是错误的
我想总会有办法解决这个问题
就此搁笔
希望喜欢的朋友推荐,并留言!
原文地址:http://www.jianfangkk.com/aspnet/201511/294
我们为controller程序增加一个GetProducts方法
让这个方法与GetAllProducts方法逻辑一致
public IEnumerable<Product> GetAllProducts() { return products; } public IEnumerable<Product> GetProducts() { return products; }
再运行程序,
发现前端AJAX已经无法正常获取数据了
对于AJAX请求
服务端返回如下内容
Multiple actions were found that match the request:
System.Collections.Generic.IEnumerable`1[HelloWebAPI.Models.Product] GetAllProducts() on type HelloWebAPI.Controllers.ProductsController\r\nSystem.Collections.Generic.IEnumerable`1[HelloWebAPI.Models.Product] GetProducts() on type HelloWebAPI.Controllers.ProductsController
也就是说
有两个同样的action满足这个请求( $.getJSON("api/products/",………..)
如果你尝试把Action名字加在请求的路径当中
比如$.getJSON("api/products/GetProducts/"….
那么就会得到这样的反馈:
"The parameters dictionary contains a null entry for parameter 'id' of non-nullable type 'System.Int32' for method 'HelloWebAPI.Models.Product GetProductById(Int32)' in 'HelloWebAPI.Controllers.ProductsController'. An optional parameter must be a reference type, a nullable type, or be declared as an optional parameter."
也就是说这个请求与
GetProductById(int id)
这个Action冲突了!
查阅微软说明得知:
在Web API的controller当中
只要方法名以“Get”开头
就会匹配所有的Get请求
同理以Post开头的方法
将匹配所有的Post请求
(目前我个人认为这是一个非常蛋疼的约定!!!)
(小尾鱼也这么认为)
插播一句
VS2012中注释与取消注释的快捷图标改成这样
也是非常蛋疼的改变!还以为是要插入个tip框!
接收POST请求
我们为实例中的controller增加一个方法
public Product PostProduct(Product item) { //do what you want return item; }
这个方法接收一个Product实体
这个实体是POST来的数据自动序列化得来的
这个工作是由WEB API完成的
在客户端POST数据的js代码如下:
function addProduct() { var da = { "Id": "1", "Name": '我POST来的数据', "Category": 'Groceries', "Price": "1.39" }; var ok = function(){alert("ok");} $.post("api/Products/", da, ok, "json"); } $(addProduct);
前端传递的JSON对象,在ACTION中被序列化为实体类型。
如下图:
好吧,假设我们没有一个类型与传递的json对象相对应
该如何是好呢?
我首先想到的是把参数改成string类型的
但string类型的参数并不能接收到任何内容
如下图所示
看来我的想法是错误的
我想总会有办法解决这个问题
就此搁笔
希望喜欢的朋友推荐,并留言!
原文地址:http://www.jianfangkk.com/aspnet/201511/294
相关文章推荐
- 【翻译】ASP.NET Web API入门
- ASP.NET Web API 简介
- asp.net 中 sql dataset 显示数据
- 【转】asp.net mvc css/js压缩合并 --- combres
- asp.net身份验证方式
- ASP.net开发环境Vs环安装注意要点
- ASP.NET上传大文件的问题
- 全新的membership框架Asp.net Identity——绕不过的Claims
- ASP.NET(C#)——DataList控件——商品展示
- Metasploit 攻击winXP
- Asp.net自定义单选复选框控件
- java中HaspMap的使用
- 开发ASP.NET MVC 开发名片二维码生成工具 (原创)
- ASP.NET MVC 入门10、Action Filter 与 内置的Filter实现(实例-防盗链)
- asp.net调用windows服务
- ASP.NET MVC4计划任务实现方法(定时执行某个功能)
- asp.net获取ListView与gridview中当前行的行号
- [Jasper使用总结]iReport报表设计-动态列实现
- Aspxspy中提取执行cmd命令的代码
- asp.net cookie和session的详细使用
CKEditor+CKFinder使用与配置
CkEditor 4.1.3 + CkFinder 2.4
开源Asp.Net Core小型社区系统DotNetClub
SQL Server修改表结构后批量更新所有视图