Нокаут.js и список флажков: опубликовать в контроллере mvc

У меня есть модель представления MVC, которая выглядит так:

public class DirectorySearchModel
{
    [Display(Name = "First name contains")]
    public string FirstName { get; set; }

    [Display(Name = "Last name contains")]
    public string LastName { get; set; }

    public CountriesCollection Countries { get; set; }
    public IEnumerable<Country> SelectedCountries { get; set; }
    public IEnumerable<Country> AllCountries { get; set; }
}

Объект CountryCollection (строка 9) выглядит так:

public class CountriesCollection
{
    [Display(Name = "Countries")]
    public int[] arrCountries { get; set; }
}

Теперь я создаю новую , пустой экземпляр CountryCollection, а затем добавить его к пустому экземпляру модели представления DirectorySearchModel, а затем сериализовать все это в модель представления javascript для Knockout.js:

{
"FirstName":null,

"LastName":null,

"Countries":{"arrCountries":[]},

"SelectedCountries":[{"RelationshipManager":{},"CountryId":1,"CountryName":"UK"},{"RelationshipManager":{},"CountryId":2,"CountryName":"France"},{"RelationshipManager":{},"CountryId":3,"CountryName":"Spain"}],

"AllCountries":[{"RelationshipManager":{},"CountryId":1,"CountryName":"UK"},{"RelationshipManager":{},"CountryId":2,"CountryName":"France"},{"RelationshipManager":{},"CountryId":3,"CountryName":"Spain"}]
}

Мои флажки отображаются как: . Отметив пару, вы получите этот нокаут Модель представления .js:

{
"FirstName":null,

"LastName":null,

"Countries":{"arrCountries":["1", "3"]},

"SelectedCountries":[{"RelationshipManager":{},"CountryId":1,"CountryName":"UK"},{"RelationshipManager":{},"CountryId":2,"CountryName":"France"},{"RelationshipManager":{},"CountryId":3,"CountryName":"Spain"}],

"AllCountries":[{"RelationshipManager":{},"CountryId":1,"CountryName":"UK"},{"RelationshipManager":{},"CountryId":2,"CountryName":"France"},{"RelationshipManager":{},"CountryId":3,"CountryName":"Spain"}]
}

Нормальная отправка моего представления (т. е. с помощью кнопки отправки, а не с помощью Knockout.js) в действие MVC, которое ожидает DirectorySearchModel, я могу запросить model.Countries.arrCountriesдля получения списка проверенных элементов, но когда я использую...

$.post("/MyController/MyAction", ko.toJS(viewModel), function(returnData) {
    $("#resultCount").html(returnData);
});

или...

$.post("/MyController/MyAction", viewModel, function(returnData) {
    $("#resultCount").html(returnData);
});

для другого действия, которое ожидает того же DirectorySearchM odel, model.Countries.arrCountriesвсегда null! Я задавался вопросом, не связано ли это с тем, что Knockout.js публикует записи arrCountriesкак string[]s, когда MVC ожидает int[]s, но меняет мой код MVC ожидать, что string[]s, похоже, не сильно изменится..! Объект CountryCollectionв DirectorySearchModel, по-видимому, существует, но это arrCountriesвнутри которого всегда null.

Есть идеи? Любая помощь высоко ценится!

Изменить

Действие, которое получает viewModel Knockout.js:

public MvcHtmlString ResultCount(DirectorySearchModel model)
{
    return new MvcHtmlString(getResultCount(model).ToString());
}

Метод getResultCount:

public int getResultCount(DirectorySearchModel model)
{
    IUserRepository userRepository = new UserRepository();
    int count = userRepository.Search(model, null).Count();
    return count;
}

ИСПРАВЛЕНО!

Спасибо Константину за указание на то, что достаточно было просто переключиться с $.post на $.ajax, чтобы отправить мою модель представления Knockout.js обратно в действие mvc! Вот код $.ajax, который я использую:

$.ajax({  
    type: "POST",
    url: "/MyController/MyAction",
    data: ko.toJSON(viewModel),
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    success: function (data) {
        $("#resultCount").html(data);
    }
});
6
задан user1390429 24 May 2012 в 21:49
поделиться