MVC3 & JSON.stringify() ModelBinding returns null model

I am trying to get model binding with MVC3 and JSON working but I have had no luck… No matter what I do I seem to be getting a null model on the server.

Method Signature:

public ActionResult FilterReports(DealSummaryComparisonViewModel model)

Javascript UPDATED:

<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>

Models:

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<Rto> Rtos { get; set; }

    public int? SelectedPricingPointId { get; set; }
    public ICollection<PricingPoint> PricingPoints { get; set; }

    public int? SelectedLoadTypeId { get; set; }
    public ICollection<LoadType> LoadTypes { get; set; }

    public int? SelectedBlockId { get; set; }
    public ICollection<Block> Blocks { get; set; }

    public int? SelectedRevisionStatusId { get; set; }
    public ICollection<RevisionStatus> RevisionStatuses { get; set; }

    public bool? DealStatus { get; set; }
}

The model looks fine on the client side:

{"ReportingFilters":{
    "SelectedRtoId":"5",
    "SelectedPricingPointId":"20",
    "SelectedLoadTypeId":"55",
    "SelectedBlockId":"21",
    "SelectedRevisionStatusId":"11" 
},"DealSummaries":{
    "SelectedItemIds":["21","22","23","24","25"] 
}}

So why am I getting nothing back on the controller? This has been giving me trouble for the past two days so please help! Thanks!!

UPDATE
I’ve updated my javascript section to what I am currently using. This section now returns the model to the controller with the ReportingFilers and DealSummaries objects, but all values within are null.

Does it possibly have something to do with the values being strings? If so, how can I fix this?

Answers:

Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.

Method 1

Change your $.getJSON line to:

$.ajax({ 
   url: '@Url.Action("FilterReports")',
   data: JSON.stringify(viewModel),
   contentType: 'application/json',
   dataType: 'json',
   success: function (data) { alert(data); }
});

This way MVC knows that it is receiving JSON and will bind it to your model correctly.

Method 2

Here’s a few different things you could try:

  • Apparently you shouldn’t use nullable properties in your objects if you want to use the DefaultModelBinder: ASP.NET MVC3 JSON Model-binding with nested class. So you could try making your ints not nullable or if that’s not an option, implement IModelBinder yourself?
  • Have you marked your classes with the SerializableAttribute?
  • Try setting the type parameter in the ajax method to ‘POST’ – it will be using ‘GET’ by default.. type: 'POST'
  • Try explicitly setting the contentType parameter in the ajax method to this instead… contentType: 'application/json; charset=utf-8'
  • And finally, are you definitely using MVC 3, not MVC 2? I ask because MVC 3 has the JsonValueProviderFactory baked into the framework where as MVC 2 didn’t so if you were using MVC 2 that might explain the problem you’re having…

Method 3

Ok, replace:

{ model: JSON.stringify(viewModel) }

with

{ model: viewModel }

You’re mixing objects with JSON strings, so jQuery will JSON.stringify the entire object. Which will double encode viewModel.

Method 4

here is what I would suggest, in your controllers action method should look as follows:

public JsonResult FilterAction(string model)
{
   var viewModel=new JavaScriptSerializer().Deserialize<DealSummaryComparisonViewModel>(model);
}

Also make sure your request is reaching the right action and look at Firebug for the same.

Method 5

Try this:

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);
});


All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0

0 0 votes
Article Rating
Subscribe
Notify of
guest

0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x