You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET MVC中HTTP PUT请求无法正常工作的问题排查

解决.NET MVC中PUT请求更新失败的问题

首先明确一点:PUT请求并不是只适用于Web API,在.NET MVC项目里完全可以正常使用,你的问题大概率是实现细节上的小疏漏导致的。我帮你分析下问题所在,以及对应的修复方案:

核心问题分析

你的PUT请求失败主要有两个关键原因:

  1. 复杂类型参数未指定绑定来源:MVC默认不会自动从PUT请求的请求体中解析复杂类型(比如List<Time>),需要明确告诉框架从哪里获取这个参数。
  2. 后端方法未接收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>节点下是否有类似配置:
    <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>
    
    WebDAV模块有时候会拦截PUT请求,移除它可以解决问题。
  • AntiForgeryToken验证:如果你的项目全局启用了AntiForgery验证,PUT请求也需要带上验证令牌。可以在前端AJAX的headers里添加:
    headers: {
      'RequestVerificationToken': $('input[name="__RequestVerificationToken"]').val()
    }
    
    同时后端方法加上[ValidateAntiForgeryToken]特性(不过你的POST请求能成功,大概率这个不是问题)

内容的提问来源于stack exchange,提问作者Ali Kleit

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 06:47:52