MVC 5 ASP.NET JsonResult传参为null问题求助
解决下拉框联动参数为null+SQL参数找不到的问题
哥们,我之前踩过几乎一模一样的坑,结合你描述的现象,咱们一步步来排查解决:
第一步:先搞定控制器接收参数为null的问题
这是后续SQL报错的根源之一,因为如果控制器拿不到值,传到SQL里的参数自然有问题。你可以从这几个方向查:
检查AJAX请求的序列化和ContentType
确保你的jQuery AJAX请求里,把参数用JSON.stringify()序列化,并且指定contentType: "application/json",不然控制器没法正确解析JSON格式的参数。比如:$.ajax({ url: "/YourController/GetDropdownOptions", type: "POST", contentType: "application/json", data: JSON.stringify({ businessunitCd: $("#businessUnit").val(), facilityCd: $("#facility").val() }), success: function(data) { // 渲染下拉框逻辑 } });控制器参数的接收方式要正确
如果是POST请求传递JSON,必须给参数加上[FromBody]属性,而且参数的命名要和AJAX里的完全一致。比如可以用一个实体类来接收:public class DropdownFilter { public string businessunitCd { get; set; } public string facilityCd { get; set; } } [HttpPost] public ActionResult GetDropdownOptions([FromBody] DropdownFilter filter) { // 这里打个断点,看看filter里的两个属性是不是有值了 var data = _sqlPersistor.GetData(filter.businessunitCd, filter.facilityCd); return Json(data); }如果不想用实体类,单独传参数的话,要注意
[FromBody]只能用一次,所以得调整请求格式,或者改用GET(但联动建议用POST)。
第二步:解决SQLPersistor里找不到@FAC_CD的问题
当控制器能拿到有效参数后,接下来排查SQL层的问题:
确认SqlCommand里正确添加了参数
检查你在SQLPersistor里的代码,是不是给SqlCommand添加了@FAC_CD参数,并且参数名和存储过程里的完全一致(SQL是不区分大小写,但最好严格匹配避免坑)。比如:public List<DropdownItem> GetData(string businessunitCd, string facilityCd) { var result = new List<DropdownItem>(); using (var conn = new SqlConnection(YourConnectionString)) { conn.Open(); using (var cmd = new SqlCommand("YourStoredProcedureName", conn)) { cmd.CommandType = CommandType.StoredProcedure; // 一定要添加对应的参数,参数名要和存储过程里的一致 cmd.Parameters.AddWithValue("@BUSINESS_UNIT_CD", businessunitCd); cmd.Parameters.AddWithValue("@FAC_CD", facilityCd); // 这里之前报错,现在参数加对了应该就没问题了 using (SqlDataReader dr = cmd.ExecuteReader()) { while (dr.Read()) { // 读取数据并添加到result } } } } return result; }验证存储过程的参数定义
直接去数据库里查看存储过程的定义,确认它确实有@FAC_CD这个参数,没有拼写错误。比如存储过程开头应该是:CREATE PROCEDURE YourStoredProcedureName @BUSINESS_UNIT_CD VARCHAR(50), @FAC_CD VARCHAR(50) AS BEGIN -- 存储过程逻辑 END
额外的排查小技巧
- 打开浏览器F12的Network面板,查看AJAX请求的Request Payload,确认里面的
businessunitCd和facilityCd确实是你选中的有效取值。 - 在控制器和SQLPersistor里都打个断点,一步步跟踪参数的传递路径,看在哪一步变成了null或者没传对。
- 直接在数据库里执行存储过程,传入测试值,比如
EXEC YourStoredProcedureName 'TEST_BU', 'TEST_FAC',确认存储过程本身能正常运行。
按照这个顺序排查,应该能很快解决你的问题!
内容的提问来源于stack exchange,提问作者Angela
相关产品推荐
相关产品推荐

