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]=AscendingASP.NET MVC のニーズColumn=make&Direction=Ascending

したがって、次の 2 つのオプションがあります。

  • 複数の複雑なパラメーターを扱う場合は、GET の代わりに POST を使用します。

  • 正しい (ASP.NET MVC 用の) プロパティ名を使用するように変更しますparams(そのため、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 に答える