http://www.cnblogs.com/liulun/archive/2012/06/20/2556556.html

蛋疼的路由规则约定

上一篇文章

我们成功通过AJAX获取到了服务器的数据,

而且服务器根据请求的类型,格式化数据之后再传给客户端。

然而

在上一篇的实例中,

我们为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类型的参数并不能接收到任何内容

如下图所示

看来我的想法是错误的

我想总会有办法解决这个问题

就此搁笔

希望喜欢的朋友推荐,并留言!

ASP.NET WebAPI 路由规则与POST数据 【转】的更多相关文章

  1. C# webapi 路由规则和接收数据

    1:新建的web api项目 默认的访问api方式:  (get,post,delect,put)  api+控制器  以Post为例子 post提交单个参数: 接收方法  post提交多个参数  接 ...

  2. 第二十一节:Asp.Net Core MVC和WebApi路由规则的总结和对比

    一. Core Mvc 1.传统路由 Core MVC中,默认会在 Startup类→Configure方法→UseMvc方法中,会有默认路由:routes.MapRoute("defaul ...

  3. ASP.NET WebApi 路由配置【转】

    一.路由介绍 ASP.NET Web API路由是整个API的入口.我们访问某个资源就是通过路由映射找到对应资源的URL.通过URL来获取资源的. 对于ASP.NET Web API内部实现来讲,我们 ...

  4. ASP.NET WebApi 路由配置

    ASP.NET Web API路由是整个API的入口.我们访问某个资源就是通过路由映射找到对应资源的URL.通过URL来获取资源的. 对于ASP.NET Web API内部实现来讲,我们的请求最终将定 ...

  5. ASP.NET MVC路由规则

    1 是从上往下寻找路由规则的 2 如果上面的匹配了,则下面的不会匹配 3 假如域名是www.startpress.cn 路由规则是 routes.MapRoute( name: "Defau ...

  6. Asp.Net Webapi路由基本设置

    1.直接在Global.asax中添加配置 如: using MvcApplication4.App_Start; using System; using System.Collections.Gen ...

  7. web api 路由规则和接收数据

    1:默认是不带action的 所以再访问的时候 只需要 api/控制 2:加了action 就要 api/控制器/方法名字 接收方法  传参 json 序列化传参

  8. 【笔记】Asp.Net WebApi对js POST带参数跨域请求的支持方案

    先说下需求:在原来的WebApi项目中增加对js跨域的请求支持,请求方式:以POST为主,webapi路由规则根据原项目需求修改如下: public static void Register(Http ...

  9. ASP.NET WebAPI从入门

    在新出的MVC4中,增加了WebAPI,用于提供REST风格的WebService,新生成的WebAPI项目和典型的MVC项目一样,包含主要的Models.Views.Controllers等文件夹和 ...

随机推荐

  1. Appium Windows服务端GUI详解

    Appium Windows服务端GUI各项的解释,从官方扒过来的,界面图标和最新版本有点不太一样,其他还是比较简单易懂的 原文https://github.com/appium/appium-dot ...

  2. 连接Oracle 10g时ORA-12514:TNS:监听进程不能解析在连接描述符中给出的SERVICE_NAME错误的解决

    近日服务器断电,导致客户端连接ORACLE服务器时出现ORA-12514错误,在网上查得解决方法如下 解决方法: 1. 打开/network/admin/listener.ora文件,找到: SID_ ...

  3. linux常用的日志分析脚本

    linux实用的日志分析脚本 日志分析 随意的tail一个access_log文件,下面是一条经典的访问记录 /Dec/::: +] “GET /query/trendxml/district/tod ...

  4. [oldboy-django][1初始django]web框架本质 + django框架 + ajax

    web框架本质 浏览器(socket客户端) - 发送请求(ip和端口,url http://www.baidu.com:80/index/) - GET 请求头(数据请求行的url上: Http1. ...

  5. (转载)CentOS 6.5使用aliyun镜像来源

    (原地址:http://www.linuxidc.com/Linux/2014-09/106675.htm) 当我们把CentOS 6.5安装好以后,可以使用这个脚本来使用国内的阿里云镜像源 #!/b ...

  6. 谈谈Python中元类Metaclass(二):ORM实践

    什么是ORM? ORM的英文全称是“Object Relational Mapping”,即对象-关系映射,从字面上直接理解,就是把“关系”给“对象”化. 对应到数据库,我们知道关系数据库(例如Mys ...

  7. 前端构建工具gulpjs的使用介绍及技巧(转)

    http://www.cnblogs.com/2050/p/4198792.html gulpjs是一个前端构建工具,与gruntjs相比,gulpjs无需写一大堆繁杂的配置参数,API也非常简单,学 ...

  8. uvalive 6323 状态压缩DP

    思路:dp[i][j][x]表示状态 i 以 j 为结束 得分为 x 的方案数. #include<iostream> #include<cstdio> #include< ...

  9. Iframe载入页面 及 跳转页面

    原文发布时间为:2009-05-05 -- 来源于本人的百度文章 [由搬家工具导入] 第一个文件 frame1.html <!DOCTYPE html PUBLIC "-//W3C// ...

  10. java网络编程(二)

    客户端程序: package net; import java.io.OutputStream; import java.net.Socket; /** * Created by hu on 2015 ...