Fork me on GitHub
ASP.NET WebAPI 路由规则与POST数据

上一篇文章

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

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

然而

在上一篇的实例中,

我们为controller程序增加一个GetProducts方法

让这个方法与GetAllProducts方法逻辑一致

        public IEnumerable<Product> GetAllProducts()
        {
            return products;
        }

        public IEnumerable<Product> GetProducts()
        {
            return products;
        }
 

再运行程序,

发现前端AJAX已经无法正常获取数据了

image

对于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中注释与取消注释的快捷图标改成这样

image

也是非常蛋疼的改变!还以为是要插入个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中被序列化为实体类型。

如下图:

DN$E(GR)3W44~9YIQN2LVW3

好吧,假设我们没有一个类型与传递的json对象相对应

该如何是好呢?

我首先想到的是把参数改成string类型的

但string类型的参数并不能接收到任何内容

如下图所示

image

看来我的想法是错误的

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

就此搁笔

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

 

ASP.NET/MVC/Web API

 
摘要: 蛋疼的路由规则约定在上一篇文章中我们成功通过AJAX获取到了服务器的数据,而且服务器根据请求的类型,格式化数据之后再传给客户端。然而在上一篇的实例中,我们为controller程序增加一个GetProducts方法让这个方法与GetAllProducts方法逻辑一致 public IEnumerable<Product> GetAllProducts() { return products; } public IEnumerable<Product> GetProducts() { ...阅读全文
posted @ 2012-06-16 14:57 liulun 阅读(500) | 评论 (0) 编辑

摘要: 简介ASP.NET Web API是一个可以简化创建HTTP服务的框架它支持包括浏览器和移动设备在内的各种客户端ASP.NET Web API是在.NET Framework上创建RESTful应用程序的理想平台译者注:关于RESTful web服务可以参见这里:http://zh.wikipedia.org/wiki/REST准备ASP.NET MVC 4包括ASP.NET Web API,请在这里安装:http://www.asp.net/web-api使用Visual Studio 2010或者Visual Studio 2012都可以开发关于ASP.NET Web API的特性请看这里阅读全文
posted @ 2012-06-14 16:03 liulun 阅读(1117) | 评论 (2) 编辑

摘要: 这是我所发的关于ASP .NET 4.5系列博文的第七篇文章。下一个版本的.NET和Visual Studio包括大量的新特性和新功能在开发ASP.NET 4.5 WebForms和Mvc的时候你会看到很多功能上的改进(不管是基于核心ASP.NET还是一些其他的扩展)在本篇文章中将会涵盖下一个版本的VisualStudio关于支持在ASP.NET中使用CSS3的一些改进CSS Color Picker在VisualStudio的早起版本中,CSS编辑器的智能提示引擎包括了一个颜色名称的下拉列表(硬编码)新版本的VisualStudio使用了一个功能齐全的颜色选择器可以很容易的创建新的颜色样式也阅读全文
posted @ 2012-02-26 14:37 liulun 阅读(1225) | 评论 (4) 编辑

摘要: 原文地址:http://weblogs.asp.net/scottgu/archive/2011/01/18/running-an-asp-net-mvc-3-app-on-a-web-server-that-doesn-t-have-asp-net-mvc-3-installed.aspx为了更符合中文阅读习惯,我对原文做了小幅度修改最近我们发布了一些新的Web产品 - 包括ASP.NET MVC 3。至今为止,我们已经获得了大量的反馈。有几个朋友在问我一个问题:“我的网站托管服务提供商目前还不支持ASP.NET MVC 3 - 你知道他们将来什么时候会安装吗?”好消息是,您不必等他们在We阅读全文
posted @ 2012-02-05 12:16 liulun 阅读(1428) | 评论 (2) 编辑

摘要: 开发者预览版.net 4.5.NET for Metro style appsMetro风格的应用程序是利用Windows操作系统的强大功能设计的特殊表单元素。一个称之为.NET APIs for Metro style apps的.Net的一个子集用来支持Metro风格的应用程序,可以使用C#或Visual Basic来编写Metro风格的应用程序。详见:http://go.microsoft.com/fwlink/?LinkId=228491核心新功能和改进以下这些功能和改进被添加到公共语言运行时(CLR)和.NET的类内:-设置正则表达式执行匹配的超时时间-为应用程序域设置区域性信息-控阅读全文
posted @ 2012-01-09 13:54 liulun 阅读(5026) | 评论 (30) 编辑

摘要: 文章修改,新增业务的C#代码[HttpPost] [ValidateInput(false)] public ActionResult AddNew(FormCollection values) { var db = new ddrDBEntities(); XinWen obj = new XinWen(); if (!string.IsNullOrEmpty(Request["id"])) { var id = Guid.Parse...阅读全文
posted @ 2011-10-01 09:33 liulun 阅读(335) | 评论 (0) 编辑

摘要: C# public ActionResult BiaoDan(int? page) { int pageindex = 1; if (page > 0) { pageindex = (int)page; } var pagesize = 6; pageindex = pageindex - 1; var db = new ddrDBEntities(); ...阅读全文
posted @ 2011-09-24 10:26 liulun 阅读(152) | 评论 (3) 编辑

摘要: 先看一下我的解决方案的目录结构吧~~~一:先把Controller程序提取出来默认的情况是所有的****Controller.cs文件都会放在Web程序集下的一个叫Controllers的文件夹下这样感觉有点不爽(你懂的...)我们决定把所有的Controller程序放到一个自定义的应用程序集中去(上图中的mrlh.Admin.Controllers)先把web程序集下的Global.asax.cs文件删掉然后把Global.asax的标记代码改为如下:<%@ Application Codebehind="mrlh.Admin.Controllers.App.MvcAppli阅读全文
posted @ 2010-11-18 12:05 liulun 阅读(1531) | 评论 (10) 编辑

摘要: ValidateInput(false)与this.ValidateRequest = false无效的解决方案鼓捣了半天终于解决了这个问题写出来叫后人少费点劲在最外层的web.config中的systerm.web节点中加入这么一句话<httpRuntime requestValidationMode="2.0"/>一切就OK了~~~阅读全文
posted @ 2010-11-15 21:03 liulun 阅读(328) | 评论 (5) 编辑

摘要: //方法1 //using System.Runtime.Serialization.Json; //using System.IO; //using System.Text; //using System.Text.RegularExpressions; DataContractJsonSerializer jsonSerializer = new DataContractJsonSerializer(arr.G...阅读全文
posted @ 2010-10-26 13:32 liulun 阅读(259) | 评论 (1) 编辑

摘要: DEMO的下载地址:https://files.cnblogs.com/liulun/flashUploader.rar参考文章所在地址:http://blog.l4cd.net/post-old-102.htmlhttp://www.kingnare.com/auzn/archives/548本来想做SL版的断点续传,但是客户觉得SL客户端占有率太低就选择采用FLASH版的了FLASH AS3.0...阅读全文
posted @ 2010-06-16 15:15 liulun 阅读(629) | 评论 (0) 编辑

摘要: 写这玩意主要是为了锻炼一下英文水平第一篇翻译的比较详细一个是看看这个书翻译容易不容易第二个是看看自己有没有这个水平接下来的翻译可能就只检重点的翻译了Asp.net mvc 实战Jeffrey PalermoBen ScheirmanJimmy BogardAsp.net mvc framework入门这一章主要包括:1asp.net mvc框架的系统要求2运行第一个项目3“HellowWorld”示例4强类型视图5路由基础在微软平台上开发web项目的时间越长你越能体会到如下的痛苦九十年代开发人员用服务器上的可执行程序创建动态网站这些程序(CGI在当时是一个非常普遍的技术)接收web请求并负责创阅读全文
posted @ 2010-03-17 17:58 liulun 阅读(262) | 评论 (0) 编辑

摘要: using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Net;using System.IO;using System.Text.RegularExpressions;namespace allen{ class Program { /// <summary...阅读全文
posted @ 2010-03-06 14:31 liulun 阅读(349) | 评论 (1) 编辑

摘要: 最近项目完成有一段空闲的时间写了个MVC的留言本发出来分享给大家1项目是用vs2010开发的2数据文件是XML的3使用时请先修改XLMessages\XLMessages\Models\DBAccess\MessageService.cs的数据文件的路径4程序参考了T2噬菌体的MVC的案例教程项目下载地址:下载-------------------------------------------最近项目完成有一段空闲的时间写了个MVC的留言本发出来分享给大家1项目是用vs2010开发的2数据文件是XML的3使用时请先修改XLMessages\XLMessages\Models\DBAccess阅读全文
posted @ 2009-11-17 09:53 liulun 阅读(345) | 评论 (0) 编辑

摘要: 一:减少HTTP请求二:为静态文件建立不同的域三:处理HTTP头中的状态码四:启用Gzip压缩五:将样式表放在顶部阅读全文
posted @ 2009-09-28 13:39 liulun 阅读(115) | 评论 (1) 编辑

摘要: 我说的表现层单指界面(即aspx的实现)一:GridView DataList等笨重的数据控件我是不怎么用的因为他产生了许多table标签有朋友说存在即合理,微软费这么大劲开发这些控件肯定有用确实 我觉得是给那些要求快速开发的人用用的《相搭积木一样做软件》这个书我想就是给这类人看的二:repeater和listview相对轻量一些但是我也不怎么用因为用这些控件一般要用到Eval之类的绑定而微软是通...阅读全文
posted @ 2009-09-24 14:44 liulun 阅读(266) | 评论 (3) 编辑

摘要: 大型网站中的验证码解决方案阅读全文
posted @ 2009-06-08 19:35 liulun 阅读(493) | 评论 (5) 编辑

摘要: 组合控件与WebControl控件的事件和属性相差不大组合控件,顾名思义就是把一些控件组合起来形成一个控件这个控件将包含这些控件称为他的子控件CompositeControl类实现了INameContainer接口这样使得复合控件下的子控件都根据各自的层级关系生成唯一的客户端标识不至于产生重复的ID组合控件比较重要的方法是:1.EnsureChildControls此方法判断属性ChildControlsCreated是否为true如果不是将执行下面的事件2.CreateChildControls此方法创建并生成组合控件下的所有子控件此方法执行完后应该设置ChildControlsCreate阅读全文
posted @ 2009-01-20 19:05 liulun 阅读(124) | 评论 (0) 编辑

摘要: Control类的Render方法在WebControl类中被被分成三部分1:RenderBeginTag,呈现标签的开始2:RenderContents,呈现标签的内容3:RenderEndTag,呈现标签的结束一般情况下不重写RenderBeginTag和RenderEndTagRenderBeginTag生成什么样的标签由WebControl.TagKey和WebControl.TagName决定默认的TagKey是Span(假设你想直接输出文本,那么你重写的TagKey是Unknown,TagName是string)WebControl提供一个AddAttributeToRender方阅读全文
posted @ 2009-01-20 15:43 liulun 阅读(99) | 评论 (0) 编辑

摘要: url重写就是把一些类似article.aspx?id=28的路径重写成 article/28/这样的路径当用户访问article/28/的时候我们通过asp.net把这个请求重定向到article.aspx?id=28路径有两种方法可以做这件事情一:基于HttpModule的方案这个方案有有缺点,具体缺点以后再谈我曾写过一篇文章《不用组件的url重写(适用于较大型项目) 》就是按这个模式写的二:基于HttpHandler的方案我们这个例子就是按这个方案做的我们接下来就按这种方式做这个例子三:基于HttpHandlerFactory的方案顾名思义这是一个工厂,可以根据不同的文件来处理请求先看w阅读全文
posted @ 2009-01-20 13:15 liulun 阅读(213) | 评论 (0) 编辑

摘要: 一:简要介绍一下asp.net的执行步骤 1.IIS接收到客户请求 2. IIS把请求交给aspnet_isapi.dll处理3.(如果是第一次运行程序)装载bin目录中的dll4.(如果是第一次运行程序)读取各级webconfig中的配置5.(如果是第一次运行程序)编译装载global.asax,初始化HttpApplication实例6.创建响应请求的HttpContext7.创建承载响应结果的HttpTextWriter8.找到合适的HttpHandler(asp.net页面),处理http请求9.处理session,异常10.把处理结果反馈个客户 当HttpApplication实例创阅读全文
posted @ 2009-01-20 12:53 liulun 阅读(241) | 评论 (0) 编辑

摘要: 一:先用最简短的话说点理论的1.asp.net中所有的标准控件都可以重写2.和控件相关的命名空间有 System.Web.UI.Control是所有控件的基类只提供简单的呈现逻辑,不支持样式表 System.Web.UI.WebControls.WebControl继承自Control支持控件外观 System.Web.UI.WebControls.CompositeControl继承自WebControl类派生出多个控件合成的复合控件3.控件树的实现原理首先Page类本身就是一个控件,它继承自Control所有的控件都有一个Render方法这个方法负责把控件的内容发送给请求者在Rend...阅读全文
posted @ 2009-01-20 11:24 liulun 阅读(172) | 评论 (0) 编辑

摘要: 有人说类似gridview datalist这样的控件最好不要用在高并发,IO大的网站中企业应用中为了快速开发到可以用一用因为这是一类"沉重"的组件我们姑且不谈这种看法的正确性(我个人觉得有道理)只谈它为什么笨重:因为这些控件给页面带来了大量的viewstate<input type="hidden" name="____VIEWSTATE" id="____VIEWSTATE" value=这就是页面状态一个页面里可能存在两种状态控件状态,视图状态page类是在LoadPageStateFromPersis阅读全文
posted @ 2009-01-19 19:31 liulun 阅读(319) | 评论 (0) 编辑

摘要: 我这里只写几个常用的事件1.OnPreInit:此事件后将加载个性化信息和主题2.OnInit:初始化页面中服务器控件的默认值但控件的状态没有加载,没有创建控件树3.OnPreLoad:控件完成状态和回传数据的加载4.Page_Load:此事件是在OnInit中订阅的5.Render:呈现最终页面的内容假设有一个文章数据库以前都是通过article.aspx?id=123的动态形式访问的现在我们想要减轻服务器压力,把文章生成静态文件先看article.aspx的程序usingSystem;usingSystem.Collections;usingSystem.Configuration;usi阅读全文
posted @ 2009-01-14 20:58 liulun 阅读(169) | 评论 (0) 编辑

摘要: 图片的无级缩放和无级截取阅读全文
posted @ 2008-11-28 13:27 liulun 阅读(763) | 评论 (1) 编辑

摘要: 耗时很长的服务器端事件中让客户端得到中间过程信息的合理解决方案阅读全文
posted @ 2008-08-19 15:39 liulun 阅读(1943) | 评论 (7) 编辑

摘要: 耗时很长的服务器端事件中让客户端得到中间过程信息的合理解决方案阅读全文
posted @ 2008-08-17 13:13 liulun 阅读(2419) | 评论 (17) 编辑

摘要: 一:首先要明白的几个术语1.Microsoft中间语言Microsoft Intermediate Language简写为MSIL或者直接叫IL大多数技术文章中也是叫IL所有编译好的代码都要使用这种语言,把代码编译成中间语言,这些编译好了的就叫托管代码(managed code)2.CLR是公共语言运行库或者.net运行库托管代码都是在公共语言运行库下运行的知道这两个术语的概念了,那么我们大致看一...阅读全文
posted @ 2008-08-16 15:28 liulun 阅读(486) | 评论 (0) 编辑

摘要: 网上很多关于url重写的教程都推荐下载某某某组件,我个人不喜欢这样,即使是M$的组件也一样,因为我们干程序员的,越贴近真相越好那么我也写一个关于url重写的文章,希望对和我一样有个性的coder们有点帮助先在网站根目录下建立一个config文件夹,再在此文件架下建立一个urls.config文件,这里记录url的配置信息代码如下[代码]我这里只写了一种规则然后修改网站的web.config文件,修...阅读全文
posted @ 2008-08-16 13:04 liulun 阅读(1031) | 评论 (12) 编辑

摘要: 相信有的程序员已经看到这个功能,或者要开发这个功能了,项目开发好,要交付客户的时候,怎么样最简便的部署呢.只要把需要的文件上传到FTP空间上,然后运行xxx.aspx,按提示步骤.操作完成后,项目就部署好并可以正常的运行了.是不是很方便?那么我们就看看这个功能是怎么开发的一在web根目录下建立一个目录叫install好了,然后在此目录下建立index.aspx,给出一些基本的提示,如欢迎安装某某某...阅读全文
posted @ 2008-08-16 10:25 liulun 阅读(554) | 评论 (0) 编辑

摘要: 我一共把系统分了五大块,最后一块命名为"其他",缓存依赖相关CacheDependencyFactory 缓存依赖类的工厂类ICacheDependency 缓存依赖类接口TableCacheDependency 缓存依赖实现类数据相关DALFactory 数据层的抽象工厂IDAL 数据访问层接口定义SQLServerDAL SQLServer数据访问层OracleDALOracle数据访问层DB...阅读全文
posted @ 2008-03-17 14:17 liulun 阅读(261) | 评论 (3) 编辑

摘要: 1.这个题目有歧义,既可以理解成初学者的分析,也可以理解成面向初学者的分析,不管怎么理解都是对的.2.我是个菜鸟,写这个东西之前,我看了几篇分析pet shop 4.0的文章,觉得很不适合初学者.我在这里写这个文章也是为了弥补他们的不足,文章定义为原创是不恰当的(因为我大量的引用了前辈们的东西),定义为转载也是不恰当的(因为从文章的结构到语言的组织都和其他分析文章不同).我在这里做个声明,希望不要...阅读全文
posted @ 2008-03-16 10:36 liulun 阅读(187) | 评论 (0) 编辑
 
posted on 2012-06-16 23:38  HackerVirus  阅读(980)  评论(0编辑  收藏  举报