MVC3和JSON.stringify()ModelBinding返回null模型
我试图获得与MVC3和JSON工作的模型绑定,但我没有运气……无论我做什么,我似乎在服务器上得到一个null
模型。
方法签名:
public ActionResult FilterReports(DealSummaryComparisonViewModel model)
Javascript 更新 :
$(document).ready(function () { $('#filter-reports').click(filterReports); }); function filterReports() { var filters = { SelectedRtoId: $('#SelectedRtoId').val(), SelectedPricingPointId: $('#SelectedPricingPointId').val(), SelectedLoadTypeId: $('#SelectedLoadTypeId').val(), SelectedBlockId: $('#SelectedBlockId').val(), SelectedRevisionStatusId: $('#SelectedRevisionStatusId').val() } var dealSummaries = { SelectedItemIds: $('#SelectedItemIds').val() } var model = { ReportingFilters: filters, DealSummaries: dealSummaries } $('#selected-items select option').attr("selected", "selected"); $.ajax({ url: '@Url.Action("FilterReports")', data: model, contentType: 'application/json', dataType: 'json', success: function (data) { alert(data); } }); }
楷模:
public class DealSummaryComparisonViewModel { public ReportingFiltersViewModel ReportingFilters { get; set; } public LadderListViewModel DealSummaries { get; set; } } public class LadderListViewModel { public MultiSelectList AvailableItems { get; set; } public int[] SelectedItemIds { get; set; } public MultiSelectList SelectedItems { get; set; } } public class ReportingFiltersViewModel { public int? SelectedRtoId { get; set; } public ICollection Rtos { get; set; } public int? SelectedPricingPointId { get; set; } public ICollection PricingPoints { get; set; } public int? SelectedLoadTypeId { get; set; } public ICollection LoadTypes { get; set; } public int? SelectedBlockId { get; set; } public ICollection Blocks { get; set; } public int? SelectedRevisionStatusId { get; set; } public ICollection RevisionStatuses { get; set; } public bool? DealStatus { get; set; } }
该模型在客户端看起来很好:
{"ReportingFilters":{ "SelectedRtoId":"5", "SelectedPricingPointId":"20", "SelectedLoadTypeId":"55", "SelectedBlockId":"21", "SelectedRevisionStatusId":"11" },"DealSummaries":{ "SelectedItemIds":["21","22","23","24","25"] }}
那么为什么我什么也得不到控制器? 过去两天这给了我麻烦所以请帮忙! 谢谢!!
更新我已将我的javascript部分更新为我目前正在使用的部分。 此部分现在使用ReportingFilers和DealSummaries对象将模型返回给控制器,但其中的所有值都为null。
是否可能与值为字符串有关? 如果是这样,我该如何解决这个问题呢?
将$ .getJSON行更改为:
$.ajax({ url: '@Url.Action("FilterReports")', data: JSON.stringify(viewModel), contentType: 'application/json', dataType: 'json', success: function (data) { alert(data); } });
这样MVC知道它正在接收JSON并将它正确地绑定到您的模型。
您可以尝试以下几种不同的方法:
-
显然,如果要使用
DefaultModelBinder
则不应在对象中使用可空属性: ASP.NET MVC3 JSON模型绑定与嵌套类 。 所以你可以尝试让你的int不可为空,或者如果那不是一个选项,你自己实现IModelBinder
? -
您是否使用
SerializableAttribute
标记了类? -
尝试将ajax方法中的type参数设置为’POST’ – 默认情况下它将使用’GET’。
type: 'POST'
-
尝试将ajax方法中的contentType参数显式设置为…
contentType: 'application/json; charset=utf-8'
contentType: 'application/json; charset=utf-8'
-
最后,你肯定使用的是MVC 3,而不是MVC 2吗? 我问,因为MVC 3将JsonValueProviderFactory烘焙到框架中,而MVC 2没有这样,如果你使用的MVC 2可以解释你所遇到的问题……
好的,替换:
{ model: JSON.stringify(viewModel) }
同
{ model: viewModel }
您正在使用JSON字符串混合对象,因此jQuery将JSON.stringify整个对象。 这将对viewModel进行双重编码。
这是我建议的,在你的控制器动作方法应如下所示:
public JsonResult FilterAction(string model) { var viewModel=new JavaScriptSerializer().Deserialize(model); }
还要确保您的请求达到正确的操作,并查看Firebug。
试试这个:
var filters = new Object(); filters.SelectedRtoId = $('#SelectedRtoId').val(); filters.SelectedPricingPointId = $('#SelectedPricingPointId').val(); filters.SelectedLoadTypeId = $('#SelectedLoadTypeId').val(); filters.SelectedBlockId = $('#SelectedBlockId').val(); filters.SelectedRevisionStatusId = $('#SelectedRevisionStatusId').val(); var dealSummaries = new Object(); dealSummarties.SelectedItemIds = $('#SelectedItemIds').val(); var viewModel = new Object(); viewModel.ReportingFilters = filters; viewModel.DealSummaries = dealSummaries; $('#selected-items select option').attr("selected", "selected"); $.getJSON('@Url.Action("FilterReports")', { model: JSON.stringify(viewModel) }, function (data) { alert(data); });