在put里面,想穿一个id 和一个对象,一直报404
controller接收参数是这样的
put(int id,[frombody] table obj)
id是要放在url里的也就是请求里的url是 api/控制器/123,请求的data是实体.你那样写倒是没错.
id放到url里面是可以的,为甚么我那样写不行,求教
@不知道风往哪儿吹: 有个网站地址是:asp.net 上面看教程.你需要的是路由和模型绑定这2块的知识点.
试试在web.config中添加如下的配置:
<system.webServer> <handlers> <remove name="ExtensionlessUrlHandler-Integrated-4.0" /> <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" /> </handlers> </system.webServer>
<system.webServer>下面已经有这些了
<remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" /> <remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" /> <remove name="ExtensionlessUrlHandler-Integrated-4.0" /> <add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" /> <add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" /> <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
@不知道风往哪儿吹: 如果已经有了,在<system.webServer>添加如下的配置试试:
<modules> <remove name="WebDAVModule" /> </modules>
@dudu: 还是404,不懂他到底是怎样接收的
@不知道风往哪儿吹: 你是用IIS运行的站点吗?
@dudu: 嗯,是的
@不知道风往哪儿吹: IIS是什么版本?应用程序池是什么模式?
@dudu: vs2013 的IIS express ,我是win8的系统
@不知道风往哪儿吹: 建议用IIS试试
[HttpPut] public void Put(InputData data){ } class InputData{ public int id{get;set;}, public Table dataModel{get;set;} }
看看行不
这样封装成一个类是可以,但是不能传两个参数吗
@不知道风往哪儿吹: 说到底,这样去想,Action的参数可以是一个对象,是因为微软的工程师在数据传到Action之前,给我们做了一些反序列化的工作。如果Action的参数是多个对象,你让做框架的人根据什么去区分是多个对象?
好奇問,Url裡不用寫ActionName?
路由里面没有配置actionName,
会依据Http方法来决定Action方法名称
404说明你的/api/productapi/,这个URL并不存在,和前面的ajax已经不是一个问题了,你要先保证可以访问/api/productapi/
使用dynamic能方便解决你的问题,其实关键是要理解原理,我替你解决了。代码贴出来你参考下。
$.ajax({ type: "put", url: "http://localhost:27221/api/Charging/Update", contentType: 'application/json', data: JSON.stringify({ id: "1", dataModel: { ProductName: "aa", Price: 1 } }), success: function (data, status) { } });
[HttpPut] public bool Update(dynamic obj) { //动态解析参数 var id = Convert.ToString(obj.id); var oModel = Newtonsoft.Json.JsonConvert.DeserializeObject<TB_Product>(Convert.ToString(obj.dataModel)); return true; }
得到结果: