【问题标题】:Send list/array as parameter with jQuery getJson使用 jQuery getJson 发送列表/数组作为参数
【发布时间】:2011-04-10 06:21:51
【问题描述】:

我有以下尝试将列表/数组发送到 MVC 控制器方法的地方:

var id = [];
var inStock = [];

$table.find('tbody>tr').each(function() {
    id.push($(this).find('.id').text());
    inStock.push($(this).find('.stocked').attr('checked'));
});

var params = {};
params.ids = id;
params.stocked = inStock; 

$.getJSON('MyApp/UpdateStockList', params, function() {
    alert('finished');
});    

在我的控制器中:

public JsonResult UpdateStockList(int[] ids, bool[] stocked) { }

两个参数都为空。

请注意,如果我将参数更改为单个项目

params.ids = 1;
params.stocked = true; 

public JsonResult UpdateStockList(int ids, bool stocked) { }

然后它工作正常,所以我不认为这是一个路由问题。

【问题讨论】:

    标签: asp.net-mvc jquery parameter-passing getjson url-parameters


    【解决方案1】:

    尝试设置traditional 标志:

    $.ajax({
        url: '/home/UpdateStockList',
        data: { ids: [1, 2, 3], stocked: [true, false] },
        traditional: true,
        success: function(result) {
            alert(result.status);
        }
    });
    

    适用于:

    public ActionResult UpdateStockList(int[] ids, bool[] stocked)
    {
        return Json(new { status = "OK" }, JsonRequestBehavior.AllowGet);
    }
    

    【讨论】:

    • 天才,谢谢!似乎在 1.4.2 的 getJson 中有一个错误,请参阅forum.jquery.com/topic/…
    • 这不是错误。与之前的版本相比,这是一个重大变化。这就是他们引入traditional 参数的原因。
    【解决方案2】:

    除了像 Darin 建议的那样调用 .ajax() 而不是 .getJSON() 或按照 jrduncans 的建议将全局 jQuery.ajaxSettings.traditional 设置为 true 之外,您还可以在您的 params 对象上传递调用 the jQuery .param() function 的结果:

    var id = [];
    var inStock = [];
    
    $table.find('tbody>tr').each(function() {
        id.push($(this).find('.id').text());
        inStock.push($(this).find('.stocked').attr('checked'));
    });
    
    var params = {};
    params.ids = id;
    params.stocked = inStock; 
    
    $.getJSON('MyApp/UpdateStockList', $.param(params, true), function() {
        alert('finished');
    });    
    

    【讨论】:

    • 是的,我同意。虽然 Darin 指出了传统的标志(你太棒了,不要误会我的意思),这个答案让你使用 getJson,这正是 OP 想要的。
    【解决方案3】:

    不幸的是,虽然 jquery 似乎提供了一个“传统”标志来切换 jQuery.ajax 上的这种行为,但它没有在 jQuery.getJSON 上。解决此问题的一种方法是全局设置标志:

    jQuery.ajaxSettings.traditional = true;

    查看 jQuery.param 的文档:http://api.jquery.com/jQuery.param/ 另请参阅此更改的发行说明:http://jquery14.com/day-01/jquery-14(搜索“传统”)

    【讨论】:

      【解决方案4】:

      在视图中,生成multiple named fields(不是id,因为id每个字段应该是唯一的),注意Name not name的使用:

      @foreach (var item in Model.SomeDictionary)
      {
          @Html.TextBoxFor(modelItem => item.Value.SomeString, new { Name = "someString[]" })
      }
      

      然后使用 jQuery 检索输入字段值,so:

      var myArrayValues = $('input[name="someString[]"]').map(function () { return $(this).val(); }).get();
      

      你可以直接在jQuery/AJAX中使用这个,如下:

      $.ajax({
          type: "POST",
          url: "/MyController/MyAction",
          dataType: 'json',
          data: {
              someStrings: $('input[name="someString[]"]').map(function () { return $(this).val(); }).get(),
              someDates: $('input[name="someDate[]"]').map(function () { return $(this).val(); }).get(),
      

      然后在MVC中的控制器动作中:

      [HttpPost]
      public JsonResult MyAction(string[] someStrings, DateTime[] someDates...
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-03-30
        • 1970-01-01
        • 1970-01-01
        • 2019-08-10
        • 2012-02-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多