1

我有一个控制器方法签名......

public ActionResult Index(int? page, GridSortOptions sortOptions, bool? listViewSelected)
{
    // do something
}

我有一个 ajax 函数来调用该方法

function loadVehicles() {
    if (page > -1 && !_inCallback) {
        _inCallback = true;
        page++;
        var url = "/memberdashboard.aspx/SearchResults/Index";

        var params = {
            page: page,
            sortOptions: { "Column": "@Model.GridSortOptions.Column", "Direction": "@Model.GridSortOptions.Direction" },
            listViewSelected: '@Model.IsListViewSelected',
        };

        $("div#loading").html('<img src="../../Content/images/InfiniteScrolling/ajax-loader.gif" />');
        $.ajax({
            url: url,
            type: "GET",
            data: params,
            dataType: "html",
            success: function (data) {
                if (data != "") {
                    $("#content").append(data);
                } else {
                    page = -1;
                }
                _inCallback = false;
                $('div#loading').empty();
            },
            error: function (jqXHR, textStatus, errorThrown) {
                alert("Unable to fetch any additional information.");
            }
        });
    }
}

对 html 代码的调查验证了“var params”具有正确的值,但是,当我进入控制器方法时,“page”具有正确的值,“listViewSelected”具有正确的值但“sortOptions”没有。有什么想法吗?

4

1 回答 1

1

当您将 GET 与复杂对象(例如,不仅仅是简单的键/值部分)一起使用时 $.ajax,不会序列化您的数据,ASP.NET MVC 喜欢它

JQuery 创建:sortOptions[Column]=make&sortOptions[Direction]=Ascending而 ASP.NET MVC 需要Column=make&Direction=Ascending

所以你有两个选择:

  • 处理多个复杂参数时使用 POST 而不是 GET

  • 更改您params以使用正确的(对于 ASP.NET MVC)属性名称(因此您的 params 对象应该是“扁平的”,因此在使用 GET 时没有嵌套对象):

    var params = {
       page: page,
       listViewSelected: '@Model.IsListViewSelected',
       Column: "@Model.GridSortOptions.Column", 
       Direction: "@Model.GridSortOptions.Direction"
    };
    

    如果您在操作中处理更复杂的对象,例如:

    public class GridParams {
          public int? page { get; set; } 
          public GridSortOptions sortOptions { get; set; } 
          public bool? listViewSelected { get; set; }
    }
    
    [HttpGet]
    public ActionResult Index(GridParams gridParams)
    {
    }
    

    然后你需要"."在属性名称中使用:

    var params = {
       page: page,
       listViewSelected: '@Model.IsListViewSelected'
    }
    
    params["sortOptions.Column"] = "@Model.GridSortOptions.Column";
    params["sortOptions.Direction"] = "@Model.GridSortOptions.Direction";
    
于 2013-08-21T20:47:48.503 回答