将ajax函数中的列表传递给控制器​​

时间:2016-07-20 07:49:55

标签: javascript ajax asp.net-mvc

我正在尝试将列表和字符串传递给控制器​​。当我调试时,我可以看到函数很好地获取了所有信息。问题是控制器收到的用户列表是空的。

这是JS功能代码:

      $(function () {
      $("#datepicker").datepicker({
          //defaultDate: "+1w",
          changeMonth: true,
          changeYear: true,
          numberOfMonths: 1,
          minDate: "01/01/2008"
      });
      $("button.action").click(function () {
          var date = $('#datepicker').val().toString();
          var selected_values = new Array();
          $(document).ready(function () {
              selected_values = []; // initialize empty array 
              $(".checked:checked").each(function () {
                  selected_value.push($(this).val());
              });
          });
          $.ajax('EmployeeDate', {
              data: {
                  lstUserName: selected_values,
                  strDate: date
              },
              success: function (data, textStatus, jqXHR) {
                  $('#DataUser').html(data);
              },
              error: function () {
                  console.log("error handler when ajax request fails... ");
              },

          });
      });
  });

以下是行动:

        public IEnumerable<DateTime> getInfoByDate(string strDate, string lstUserName)
    {
        CareDB context = new CareDB();

        SqlParameter Date = new SqlParameter("@Date", strDate);
        SqlParameter userName = new SqlParameter("@EmployeeName", lstUserName);

        object[] parameters = new object[] { Date, userName };

        IEnumerable<DateTime> lst = context.ReleaseDate.SqlQuery("_UserInformationByDate @Date, @EmployeeName", parameters).ToList();

        context.Dispose();
        context = null;
        return lst;
    }

有什么建议吗?谢谢!

修改

      $(function () {
      $("#datepicker").datepicker({
          //defaultDate: "+1w",
          changeMonth: true,
          changeYear: true,
          numberOfMonths: 1,
          minDate: "01/01/2008"
      });
      $("button.action").click(function () {
          var date = $('#datepicker').val().toString();
          var selected_values = new Array();
          $(document).ready(function () {
              selected_values = []; // initialize empty array 
              $(".checked:checked").each(function () {
                  selected_values.push($(this).val());
              });
          });
          $.ajax({
              url: 'EmployeeDate',
              datatype: "application/json",
              traditional:true, 
              data: {
                  lstUserName: selected_values,
                  strDate: date
              },
              success: function (data, textStatus, jqXHR) {
                  $('#DataUser').html(data);
              },
              error: function () {
                  console.log("error handler when ajax request fails... ");
              },

          });
      });
  });

感谢大家的帮助!

3 个答案:

答案 0 :(得分:1)

有两种方法可以将数据发送到MVC控制器:

作为JSON

您需要发送JSON字符串和.ajax() MIME类型标头。这在data: JSON.stringify({ lstUserName: selected_values, strDate: date }),方法中有两个配置:

  1. 对象进行字符串化:
  2. contentType: 'application/json'

    1. data
    2. 作为表格数据

      1. lstUserName=user1&lstUserName=user2&strDate=1/1/2016配置作为对象,但请记住,jQuery将构造一个查询字符串,每个属性作为键。在您的情况下,traditional
      2. true配置设置为DateTime strDate, string[] lstUserName,以便为lstUserName数组生成上述字符串。
      3. 然后,您可以让控制器接受.val()。但我会更改名称以从客户端和服务器中删除前缀。

        最后一点:我不确定日期选择器上.toString()的返回数据类型是什么,但是如果它是一个日期,则DateTime.Parse()是一个糟糕的选择。您应该以{{1​​}}解析的格式返回一些内容,MVC使用该格式来解析日期值。也许使用.toDateString().toISOString()

答案 1 :(得分:0)

您可以使用此方法进行此操作..

var data = { 'user_ids[]' : []};

$(".checked:checked").each(function () {
  data['user_ids[]'].push($(this).val());
});


$.ajax('EmployeeDate', {
              data: {
                  lstUserName: data,
                  strDate: date
              },
              success: function (data, textStatus, jqXHR) {
                  $('#DataUser').html(data);
              },
              error: function () {
                  console.log("error handler when ajax request fails... ");
              },

          });

如果您仍然无法做到,请告诉我。

答案 2 :(得分:0)

您正在传递selected_values这是一个数组,但您的方法参数仅为string。改为

在后端,您可以更改方法的参数以接收字符串数组。

public IEnumerable<DateTime> getInfoByDate(string strDate, string[] lstUserName)
{
    CareDB context = new CareDB();

    SqlParameter Date = new SqlParameter("@Date", strDate);
    SqlParameter userName = new SqlParameter("@EmployeeName", lstUserName);

    object[] parameters = new object[] { Date, userName };

    IEnumerable<DateTime> lst = context.ReleaseDate.SqlQuery("_UserInformationByDate @Date, @EmployeeName", parameters).ToList();

    context.Dispose();
    context = null;
    return lst;
}

或前端的 ,您可以更改数据

data: {
         lstUserName: selected_values.join(' '),
         strDate: date  },

编辑:

$.ajax('EmployeeDate', {
              data: {
                  lstUserName: selected_values,
                  strDate: date
              },
              dataType: 'json',
              success: function (data, textStatus, jqXHR) {
                  $('#DataUser').html(data);
              },
              error: function () {
                  console.log("error handler when ajax request fails... ");
              },

          });