如何在JavaScript Ajax中正确获取C#控制器返回的布尔值
问题根因
你的判断逻辑不生效的核心原因是:后端从来没有返回过布尔类型值。
两个逻辑分支最终都是return View(),返回给前端的永远是HTML格式的字符串:
- 有数据时:返回绑定了DataTable内容的渲染后视图HTML
- 无数据时:返回未绑定数据的空状态视图HTML
当前前端设置dataType: "html",接收到的result始终是字符串类型。JS里非空字符串做布尔判断时永远为true,字符串类型的值也不可能等于布尔值true,所以不管有没有数据,都会走第一个渲染轮播的分支。
另外你现有C#代码里存在逻辑问题:SqlDataReader会独占数据库连接,你之前手动关闭再重开连接的写法不仅冗余,还容易触发连接异常;SqlDataAdapter的Fill方法本身会自动管理连接开关,不需要手动重复操作。
可行解决方案
你可以根据自己的代码习惯选以下任意一种实现:
方案1:保留原有HTML返回逻辑,通过响应头传递状态(改动最小)
不需要调整视图返回逻辑,只需要在后端两个分支给响应加自定义标记头,前端从响应头读取状态判断即可。
后端C#代码修改
using (SqlConnection con = new SqlConnection(constring)) { string command = "select item_image, item_name, item_price item_number, item_type, date_added from cooking_items"; con.Open(); using (SqlCommand cmd = new SqlCommand(command, con)) { cmd.CommandTimeout = 60; SqlDataReader Creader1 = cmd.ExecuteReader(); if (Creader1.HasRows) { // 标记有数据 Response.Headers.Add("X-Has-Data", "true"); Creader1.Close(); // 关闭独占连接的DataReader再执行后续查询 DataTable dt = new DataTable(); using (SqlDataAdapter da = new SqlDataAdapter(cmd)) { da.Fill(dt); } return View("Cooking", dt); } else { // 标记无数据 Response.Headers.Add("X-Has-Data", "false"); Creader1.Close(); return View("Cooking"); } } }
前端Ajax代码修改
success回调接收第三个参数xhr,从中读取自定义响应头判断状态:
$.ajax({ url: "/Shop/Accessories", contentType: "application/html; charset=utf-8", type: 'GET', dataType: "html", success: function (result, status, xhr) { const hasData = xhr.getResponseHeader('X-Has-Data') === 'true'; if (hasData) { $('#owl1').html(result) $('#owl1').owlCarousel({ loop: true, nav: false, dots: false, autoplay: false, margin: 10, responsive: { 0: { items: 2 }, 600: { items: 3 }, 1000: { items: 4 } } }) } else { $(".noItem1").html(result); } }, error: function (xhr, status) { alert(status); } })
方案2:返回结构化JSON响应(更符合接口规范)
后端不再直接返回View,而是先把视图渲染成HTML字符串,和布尔状态值打包成JSON结构返回,前端直接读取JSON里的布尔字段判断即可。
这种方案需要额外实现一个将视图渲染为字符串的辅助方法,适合后续接口需要扩展更多返回字段的场景使用。
内容的提问来源于stack exchange,提问作者新Acesyyy
相关产品推荐
相关产品推荐

