【问题标题】:Ajax call to controller function not returning data对控制器函数的 Ajax 调用不返回数据
【发布时间】:2014-11-12 08:16:33
【问题描述】:

我有一个 MVC 5 网页,我需要使用 Ajax 从我的视图中调用我的控制器页面上的一个函数。我的问题是,即使对函数的 Ajax 调用有效(函数被调用,并返回我期望的数据),我无法在 Ajax.Success 中获取返回值,但是当我调用失败时,我可以在“错误”中得到返回值。

这是我在视图中的 Ajax 调用:

function FindFreeCards() {
$.ajax({
  url: '@Url.Action("FindFreeCards", "AdminCards")',
  contentType: "application/json; charset=utf-8",
  type: 'POST',
  success: function (data) {
    alert('SUCCESS');
    var FreeCards;
    FreeCards = data.d;

    alert(FreeCards);

    $('#lblFreeCards').html(FreeCards);
    $('#modalSelectFreeCard').modal();
  },
  error: function (request, status, error) {
    alert('ERROR');
    alert(request.responseText);
    alert(status.toString());
    alert(error.toString());
  }
});

};

这是我在控制器中的功能:

public string FindFreeCards()
{
  string FreeCards = "";

  using (SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["gbizz"].ConnectionString))
  {
    con.Open();
    SqlCommand sqlCom;
    SqlDataReader sqlReader;
    System.Data.SqlClient.SqlConnection Con = new System.Data.SqlClient.SqlConnection(ConfigurationManager.ConnectionStrings["gbizz"].ConnectionString);
    Con.Open();
    sqlCom = new SqlCommand("LicensePlateFindFreeCard", con);
    sqlCom.CommandType = CommandType.StoredProcedure;
    sqlCom.Parameters.Add("@CustomerId", SqlDbType.Int).Value = 12;

    sqlReader = sqlCom.ExecuteReader();

    if (sqlReader.HasRows)
    {
      while (sqlReader.Read())
      {
        FreeCards = FreeCards + sqlReader["CardNo"].ToString() + ", ";
      }
    }

    FreeCards = FreeCards.Trim().TrimEnd(',');

    if (FreeCards.Contains(','))
    {
      int LastComma = FreeCards.LastIndexOf(',');
      FreeCards = FreeCards.Remove(LastComma, 1);
      FreeCards = FreeCards.Insert(LastComma, " og");
    }
    sqlReader.Close();
    sqlReader.Dispose();
    sqlCom.Dispose();
    con.Close();
    con.Dispose();
  }
  return FreeCards;
}

控制器函数不带任何参数,这就是为什么我在 Ajax 调用中省略了“data:”和“dataType:”参数。

当我调用该函数时,Success 中的第一个 Alert 由单词“SUCCESS”触发,但第二个 alert(我要显示返回值的位置)显示“未定义”。

如果我在 Ajax 调用中添加参数 "data: "{}"",调用会失败,我会得到 alert('ERROR') 显示,然后是 alert(request.responseText),而这个警报实际上包含我希望在函数工作时获得的值。

有什么建议可以在 Ajax 调用成功时获取返回值吗?

【问题讨论】:

  • 您返回一个字符串,那么FreeCards = data.d; 是什么?应该只是FreeCards = data;

标签: javascript jquery ajax asp.net-mvc


【解决方案1】:

因为你要返回一个字符串这个语句

FreeCards = data.d; 

只给出未定义的。直接数据将包含结果。换行试试

FreeCards = data

希望对你有帮助

【讨论】:

  • 从 data.d 中删除“d”就可以了。几乎是我唯一没有尝试过的东西:P 谢谢!
  • 很高兴能帮到你:) 但是如果你按照标准调用 Ajax 请求而不是直接返回一个字符串会很好
  • 我是 MVC 和 Ajax 的新手,所以我还在学习“标准”。
【解决方案2】:

您需要将 json 返回为:

public ActionResult FindFreeCards()
{
  string FreeCards = "";

  using (SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["gbizz"].ConnectionString))
  {
    con.Open();
    SqlCommand sqlCom;
    SqlDataReader sqlReader;
    System.Data.SqlClient.SqlConnection Con = new System.Data.SqlClient.SqlConnection(ConfigurationManager.ConnectionStrings["gbizz"].ConnectionString);
    Con.Open();
    sqlCom = new SqlCommand("LicensePlateFindFreeCard", con);
    sqlCom.CommandType = CommandType.StoredProcedure;
    sqlCom.Parameters.Add("@CustomerId", SqlDbType.Int).Value = 12;

    sqlReader = sqlCom.ExecuteReader();

    if (sqlReader.HasRows)
    {
      while (sqlReader.Read())
      {
        FreeCards = FreeCards + sqlReader["CardNo"].ToString() + ", ";
      }
    }

    FreeCards = FreeCards.Trim().TrimEnd(',');

    if (FreeCards.Contains(','))
    {
      int LastComma = FreeCards.LastIndexOf(',');
      FreeCards = FreeCards.Remove(LastComma, 1);
      FreeCards = FreeCards.Insert(LastComma, " og");
    }
    sqlReader.Close();
    sqlReader.Dispose();
    sqlCom.Dispose();
    con.Close();
    con.Dispose();
  }
  return Json(new {d=FreeCards });
}

【讨论】:

    【解决方案3】:

    首先在控制器上使用 json 列表返回为 json,如下所示:

            public ActionResult FindFreeCards()
            {
              List <string> FreeCards = new List<string>();
    
              using (SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["gbizz"].ConnectionString))
              {
                con.Open();
                SqlCommand sqlCom;
                SqlDataReader sqlReader;
                System.Data.SqlClient.SqlConnection Con = new System.Data.SqlClient.SqlConnection(ConfigurationManager.ConnectionStrings["gbizz"].ConnectionString);
                Con.Open();
                sqlCom = new SqlCommand("LicensePlateFindFreeCard", con);
                sqlCom.CommandType = CommandType.StoredProcedure;
                sqlCom.Parameters.Add("@CustomerId", SqlDbType.Int).Value = 12;
    
                sqlReader = sqlCom.ExecuteReader();
    
                if (sqlReader.HasRows)
                {
                  while (sqlReader.Read())
                  {
                     FreeCards.add(sqlReader["CardNo"].ToString());
                  }
                }
    
    
                sqlReader.Close();
                sqlReader.Dispose();
                sqlCom.Dispose();
                con.Close();
                con.Dispose();
              }
              return Json(FreeCards);
            }
    

    然后使用 jQuery.parseJSON 解析 ajax 响应。使用以下代码:

                   function FindFreeCards() 
        {
            $.ajax({
              url: '@Url.Action("FindFreeCards", "AdminCards")',
              contentType: "application/json; charset=utf-8",
              type: 'POST',
              success: function (data) {
                /*New code */
                var data=jQuery.parseJSON(data);
                 $.each(data, function(i, item) {
                                    alert(i + " ==> "+  item );
                        });
                /*New code */
                alert('SUCCESS');
    
                var FreeCards;
                FreeCards = data.d;
    
                alert(FreeCards);
    
                $('#lblFreeCards').html(FreeCards);
                $('#modalSelectFreeCard').modal();
              },
              error: function (request, status, error) {
                alert('ERROR');
                alert(request.responseText);
                alert(status.toString());
                alert(error.toString());
              }
            });
        };
    

    【讨论】:

      猜你喜欢
      • 2021-08-04
      • 1970-01-01
      • 1970-01-01
      • 2023-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多