C# MVC3&;JSON.stringify()ModelBinding返回空模型
我试图让MVC3和JSON的模型绑定工作,但我没有运气。。。无论我做什么,我似乎在服务器上得到了一个C# MVC3&;JSON.stringify()ModelBinding返回空模型,c#,jquery,asp.net,json,asp.net-mvc-3,C#,Jquery,Asp.net,Json,Asp.net Mvc 3,我试图让MVC3和JSON的模型绑定工作,但我没有运气。。。无论我做什么,我似乎在服务器上得到了一个null模型 方法签名: public ActionResult FilterReports(DealSummaryComparisonViewModel model) Javascript已更新: <script type="text/javascript" language="javascript"> $(document).ready(function () {
null
模型
方法签名:
public ActionResult FilterReports(DealSummaryComparisonViewModel model)
Javascript已更新:
<script type="text/javascript" language="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);
}
});
}
</script>
那为什么我在控制器上什么也没得到?这两天来一直给我带来麻烦,请帮帮我!谢谢
更新
我已将javascript部分更新为当前使用的内容。本节现在使用ReportingFilers和DealSummaries对象将模型返回给控制器,但其中的所有值均为null
它是否可能与作为字符串的值有关?如果是,如何解决此问题?好的,更换:
{ model: JSON.stringify(viewModel) }
与
您将对象与JSON字符串混合,因此jQuery将JSON.stringify整个对象。这将对viewModel进行双重编码。以下是我的建议,在控制器中,操作方法应如下所示:
public JsonResult FilterAction(string model)
{
var viewModel=new JavaScriptSerializer().Deserialize<DealSummaryComparisonViewModel>(model);
}
publicJSONResult过滤器操作(字符串模型)
{
var viewModel=new JavaScriptSerializer()。反序列化(模型);
}
另外,请确保您的请求达到了正确的操作,并查看Firebug以了解相同的操作。将$.getJSON行更改为:
$.ajax({
url: '@Url.Action("FilterReports")',
data: JSON.stringify(viewModel),
contentType: 'application/json',
dataType: 'json',
success: function (data) { alert(data); }
});
通过这种方式,MVC知道它正在接收JSON,并将其正确绑定到您的模型。尝试以下方法:
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);
});
您可以尝试以下几种不同的方法:
- 显然,如果要使用
:,就不应该在对象中使用可为null的属性。因此,您可以尝试使Int不可为null,或者如果这不是一个选项,您可以自己实现DefaultModelBinder
IModelBinder
- 您是否已使用
标记您的类SerializableAttribute
- 尝试将ajax方法中的类型参数设置为“POST”-默认情况下将使用“GET”<代码>类型:“发布”
- 请尝试将ajax方法中的contentType参数显式设置为<代码>内容类型:'应用程序/json;字符集=utf-8'
- 最后,你肯定是在使用MVC3,而不是MVC2吗?我这样问是因为MVC 3将JsonValueProviderFactory烘焙到了框架中,而MVC 2没有这样做,所以如果您使用MVC 2,这可能会解释您遇到的问题
[“21”、“22”、“23”、“24”、“25”]
变成[21,22,23,24,25]
删除stringify应该实现这一点吗?不,你是如何构建javascript对象的?没错,它是stringify。我使用的是(m=m.selecteditemds,Model.SelectedItems)列表框,这就是在调用ajax查询之前选择所有hack的原因。我将如何替换字符串值?结合@IAbstractDownvoteFactory的答案,我更进一步,现在我有了带有ReportingFilters和DealSummary对象的模型对象,但现在,即使我正在向它们传递值,它们的所有属性都是空的。当你完全尝试我发布的内容时会发生什么?我得到一个包含两个空对象的模型。不幸的是,我只能接受一个作为我问题的答案,所以你得到了它,因为你的帖子对解决我的问题最有帮助。从$.getJSON切换到$.ajax做出了最重要的贡献,因为其他人都是基于它构建的。谢谢大家!哦,不,不会的。我收到的结果与用另一种方法初始化它们的结果相同。是的,我尝试了所有这些方法的组合,似乎初始化没有什么不同。谢谢!将其更新为帖子并字符串化将在控制器中为我提供模型中的所有数据,但现在无法访问我的回发。。。有什么建议吗?嗯,你的回帖没有收到是什么意思?如果在FilterReports操作和调试中放置断点,它会停止吗?你的模型不再有空值了?你的意思是说没有到达ajax回调吗?如果是这样的话,你从你的行动中得到了什么?您是否也尝试过在ajax方法上指定'error'参数?我指的是ajax回发,但我能够找到答案。我没有从FilterReports方法返回JSON。
public JsonResult FilterAction(string model)
{
var viewModel=new JavaScriptSerializer().Deserialize<DealSummaryComparisonViewModel>(model);
}
$.ajax({
url: '@Url.Action("FilterReports")',
data: JSON.stringify(viewModel),
contentType: 'application/json',
dataType: 'json',
success: function (data) { alert(data); }
});
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);
});