MVC3 & JSON.stringify () ModelBinding возвращает нулевую модель - PullRequest
7 голосов
/ 29 сентября 2011

Я пытаюсь связать модель с работающими MVC3 и JSON, но мне не повезло ... Независимо от того, что я делаю, я получаю модель 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>

Модели:

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

Модель отлично смотрится на стороне клиента:

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

Так почему я ничего не возвращаю на контроллер?Последние два дня это доставляет мне неприятности, поэтому, пожалуйста, помогите!Спасибо !!

ОБНОВЛЕНИЕ Я обновил свой раздел JavaScript до того, что я сейчас использую.Этот раздел теперь возвращает модель в контроллер с объектами ReportingFilers и DealSummaries, но все значения в нем являются нулевыми.

Возможно ли это как-то связано со значениями, являющимися строками?Если так, как я могу это исправить?

Ответы [ 5 ]

4 голосов
/ 29 сентября 2011

Измените строку $ .getJSON на:

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

Таким образом, MVC узнает, что он получает JSON, и правильно привязает его к вашей модели.

3 голосов
/ 29 сентября 2011

Вот несколько вещей, которые вы можете попробовать:

  • Очевидно, что вы не должны использовать свойства nullable в своих объектах, если хотите использовать привязку модели DefaultModelBinder: ASP.NET MVC3 JSON с вложенным классом . Таким образом, вы можете попытаться сделать ваши int-ы не обнуляемыми или, если это не вариант, реализовать IModelBinder самостоятельно?

  • Вы пометили свои классы SerializableAttribute?

  • Попробуйте установить параметр типа в методе ajax на «POST» - по умолчанию будет использоваться «GET». type: 'POST'

  • Попробуйте вместо этого явно указать для параметра contentType в методе ajax ... contentType: 'application/json; charset=utf-8'

  • И, наконец, вы определенно используете MVC 3, а не MVC 2? Я спрашиваю, потому что в MVC 3 JsonValueProviderFactory встроен в платформу, в отличие от MVC 2, если вы не использовали MVC 2, что могло бы объяснить вашу проблему ...

2 голосов
/ 29 сентября 2011

Хорошо, замените:

{ model: JSON.stringify(viewModel) }

на

{ model: viewModel }

Вы смешиваете объекты со строками JSON, поэтому jQuery будет JSON.Stringify весь объект.Который будет дважды кодировать viewModel.

1 голос
/ 29 сентября 2011

Вот что я хотел бы предложить, в вашем контроллере метод действия должен выглядеть следующим образом:

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

Также убедитесь, что ваш запрос достигает нужного действия, и посмотрите на Firebug на то же самое.

0 голосов
/ 29 сентября 2011

Попробуйте это:

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);
}); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...