.NET MVC中HTTP PUT请求无法正常工作的问题排查
解决.NET MVC中PUT请求更新失败的问题
首先明确一点:PUT请求并不是只适用于Web API,在.NET MVC项目里完全可以正常使用,你的问题大概率是实现细节上的小疏漏导致的。我帮你分析下问题所在,以及对应的修复方案:
核心问题分析
你的PUT请求失败主要有两个关键原因:
- 复杂类型参数未指定绑定来源:MVC默认不会自动从PUT请求的请求体中解析复杂类型(比如
List<Time>),需要明确告诉框架从哪里获取这个参数。 - 后端方法未接收
enrollmentId参数:前端URL里传递了enrollmentId查询参数,但你的控制器方法里没有对应的参数来接收它。
修正后的代码示例
后端控制器代码
[Route("Subjects/UpdateTimes")] // 确保路由和前端请求URL匹配,如果控制器已经有[Route("Subjects")]前缀,也可以保留原来的[Route("UpdateTimes")] [HttpPut] public bool UpdateTimes(int enrollmentId, [FromBody] List<Time> times) { // 这里添加你的业务逻辑,比如更新times记录 return true; }
关键修改点:
- 新增
int enrollmentId参数,对应前端URL中的查询参数 - 给
times参数加上[FromBody]特性,指示MVC从请求体的JSON数据中解析这个复杂类型
前端AJAX代码(可保持不变,确认以下细节)
var times = GetTimes(); // times array object var enrollmentId = $('#EnrolledSubject').data('id'); $.ajax({ contentType: 'application/json; charset=utf-8', url: "/Subjects/UpdateTimes?enrollmentId="+enrollmentId, type: "PUT", dataType: "json", data: JSON.stringify({ 'times': times}), success: function (data) { console.log(data); }, error: function (x, y, z) { console.log('error ' + y); OnAJAXError(x, y, z); } });
确认事项:
- 确保
GetTimes()返回的数组结构和后端Time类的属性完全匹配(注意属性名的大小写,比如JSON里的startTime对应C#里的StartTime,MVC默认支持驼峰命名映射,如果你的项目没有特殊配置的话) contentType设置正确为application/json; charset=utf-8,这部分你已经做对了
额外检查点
如果修改后还是失败,可以排查以下几点:
- Web.config配置:确认你的项目允许PUT请求,在
<system.webServer>节点下是否有类似配置:
WebDAV模块有时候会拦截PUT请求,移除它可以解决问题。<modules runAllManagedModulesForAllRequests="true"> <remove name="WebDAVModule" /> </modules> <handlers> <remove name="WebDAV" /> <remove name="ExtensionlessUrlHandler-Integrated-4.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" /> </handlers> - AntiForgeryToken验证:如果你的项目全局启用了AntiForgery验证,PUT请求也需要带上验证令牌。可以在前端AJAX的
headers里添加:
同时后端方法加上headers: { 'RequestVerificationToken': $('input[name="__RequestVerificationToken"]').val() }[ValidateAntiForgeryToken]特性(不过你的POST请求能成功,大概率这个不是问题)
内容的提问来源于stack exchange,提问作者Ali Kleit
相关产品推荐
相关产品推荐

