ASP.NET中JS发送Post请求无法传递正确值,请求协助排查
问题原因及解决方法
你的问题出在AJAX请求的数据格式与后端参数解析不匹配,导致后端无法正确映射你发送的数值1,最终取到int类型的默认值0。
核心问题点
- 你设置了
contentType: "application/json; charset=utf-8",但data直接传入了数值1,此时请求体内容是纯字符串"1",后端的命名参数testNumber无法与这个无键名的数值匹配。 - ASP.NET Core默认不会从JSON请求体中自动绑定简单类型(如int)的命名参数,需要显式声明从请求体读取。
解决方案一:按JSON格式规范传递数据(推荐)
修改JavaScript代码
将data改为带键名的JSON字符串,键名需与后端参数名testNumber一致,并用JSON.stringify()转换,同时阻止按钮默认提交行为避免页面刷新:
$(document).ready(function () { $("#TestButton").click(function (e) { e.preventDefault(); var valueToSend = 1; $.ajax({ url: "Home/TestMethod", type: "POST", dataType: 'json', data: JSON.stringify({ testNumber: valueToSend }), contentType: "application/json; charset=utf-8", success: function (response) { alert("Success"); }, error: function (xhr, status, error) { alert("Failed"); }, }) }) })
修改Controller代码
在参数前添加[FromBody]特性,告诉ASP.NET从请求体中解析JSON数据:
public class HomeController : Controller { public async Task<IActionResult> Index() { return View(); } [HttpPost] public IActionResult TestMethod([FromBody] int testNumber) { var value = testNumber; return View(nameof(Index)); } }
解决方案二:改用表单格式传递数据
如果不需要JSON格式,可以移除contentType配置,直接传递键值对,jQuery会自动转换为表单编码格式:
修改JavaScript代码
$(document).ready(function () { $("#TestButton").click(function (e) { e.preventDefault(); var valueToSend = 1; $.ajax({ url: "Home/TestMethod", type: "POST", dataType: 'json', data: { testNumber: valueToSend }, success: function (response) { alert("Success"); }, error: function (xhr, status, error) { alert("Failed"); }, }) }) })
Controller代码无需修改
保持原有的TestMethod方法即可,ASP.NET会自动从表单数据中绑定testNumber参数。
内容的提问来源于stack exchange,提问作者Vladimir Shvoev
相关产品推荐
相关产品推荐

