У меня есть модель представления 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);
}
});