ASP.NET MVC如何从视图传参调用存储过程并更新模型值后保存修改
问题原因及修复方案
问题1:前后端返回类型不匹配
你无存储过程的版本返回的是单个Loan对象,而调用存储过程的版本返回的是List<LoanOrder>集合对象,前端直接读取response.Borrower自然无法获取到值,因为response此时是数组类型,需要取下标访问元素。
问题2:控制器参数未传值
存储过程版本的控制器方法需要接收Cust参数,但你的前端AJAX请求没有传递该参数,会导致Cust为null,存储过程执行后大概率返回空结果集。
问题3:参数配置不规范
创建SqlParameter时没有指定VarChar的长度,默认会按长度1处理,会截断你传入的参数值,导致存储过程查询不到匹配数据。
修复代码
1. 前端AJAX代码调整
$("#btn").click(function () { // 这里替换成你实际要传递的Cust参数取值逻辑,比如从输入框取值 var custVal = "你要传的客户参数值"; $.ajax({ type: "GET", url: "/LO/AjaxGetCall", data: { Cust: custVal }, // 新增传递Cust参数 dataType: "json", success: function (response) { // 判断返回的集合有数据 if (response != null && response.length > 0) { // 取集合第一个元素的属性 alert(response[0].Borrower); $('#Borrower').val(response[0].Borrower); $('#Type').val(response[0].Type); $('#TypeOfLoan').val(response[0].TypeOfLoan); } else { alert("未查询到对应客户数据"); } }, error: function (response) { alert(response.responseText); } }); });
补充:原代码中的contentType可以删掉,GET请求传表单格式参数不需要设置json类型的contentType
2. 控制器代码调整
public JsonResult AjaxGetCall(string Cust) { // 先判空参数,避免无效查询 if(string.IsNullOrEmpty(Cust)) { return Json(new List<LoanOrder>(), JsonRequestBehavior.AllowGet); } List<LoanOrder> loan = new List<LoanOrder>(); string constr = ConfigurationManager.ConnectionStrings["Conn"].ConnectionString; using (SqlConnection con = new SqlConnection(constr)) { string query = "GetCustSP"; using (SqlCommand cmd = new SqlCommand(query)) { cmd.Connection = con; cmd.CommandType = CommandType.StoredProcedure; // 这里替换成你实际数据库中@Cust参数的长度 cmd.Parameters.Add("@Cust", SqlDbType.VarChar, 50).Value = Cust; con.Open(); using (SqlDataReader sdr = cmd.ExecuteReader()) { while (sdr.Read()) { loan.Add(new LoanOrder { Type = sdr["CUSTNO"]?.ToString() ?? "", Borrower = sdr["PRTNAM"]?.ToString() ?? "", TypeOfLoan = sdr["ADDR"]?.ToString() ?? "", }); } } con.Close(); } } return Json(loan, JsonRequestBehavior.AllowGet); }
补充:增加了字段空值判断,避免数据字段为null时抛出转换异常
内容的提问来源于stack exchange,提问作者Baize
相关产品推荐
相关产品推荐

