我有一个控制器方法签名......
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'没有。有什么想法吗?
答案 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";