GridSortOptions对象未传递给控制器​​方法

时间:2013-08-21 20:17:23

标签: jquery c#-4.0 asp.net-mvc-4

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

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'没有。有什么想法吗?

1 个答案:

答案 0 :(得分: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对象应该是“flat”,因此在使用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";