Knockout.js & lista de casillas de verificación:post para controlador mvc
Pregunta
Tengo un MVC modelo de vista que se parece a esto:
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; }
}
El CountriesCollection objeto (línea 9) se parece a esto:
public class CountriesCollection
{
[Display(Name = "Countries")]
public int[] arrCountries { get; set; }
}
Ahora, estoy creando una nueva, en blanco instancia de CountriesCollection y, a continuación, agregarlo a un espacio en blanco de la instancia de la DirectorySearchModel modelo de vista y, a continuación, serialising a todos en un javascript para ver el modelo 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"}]
}
Mi casillas se representa como: <input checked="checked" data-bind="checked: Countries.arrCountries" id="Countries_arrCountries30" name="Countries.arrCountries" type="checkbox" value="1">
.La comprobación de un par significa que terminar con esto Knockout.js modelo de vista:
{
"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"}]
}
La presentación de mi vista normalmente (es decir,a través de un botón de enviar y no con Knockout.js) a un citatorio de la acción que espera un DirectorySearchModel
, Soy capaz de pedir model.Countries.arrCountries
para obtener una lista de los elementos de control, pero cuando voy a usar...
$.post("/MyController/MyAction", ko.toJS(viewModel), function(returnData) {
$("#resultCount").html(returnData);
});
o...
$.post("/MyController/MyAction", viewModel, function(returnData) {
$("#resultCount").html(returnData);
});
para otro tipo de acción que se espera que el mismo DirectorySearchModel
, model.Countries.arrCountries
siempre es null
!Me preguntaba si es debido a Knockout.js la publicación de la arrCountries
entradas como string[]
s cuando MVC está esperando int[]
s, pero el cambio de mi MVC código de esperar string[]
s no parecen cambiar mucho..!El CountriesCollection
objeto dentro de la DirectorySearchModel
parece existir, pero es la arrCountries
dentro de los que siempre null
.
Alguna idea?Cualquier ayuda muy apreciada!
Editar
La acción que recibe el Knockout.js perspective:
public MvcHtmlString ResultCount(DirectorySearchModel model)
{
return new MvcHtmlString(getResultCount(model).ToString());
}
El getResultCount
método:
public int getResultCount(DirectorySearchModel model)
{
IUserRepository userRepository = new UserRepository();
int count = userRepository.Search(model, null).Count();
return count;
}
FIJO!
Gracias a Konstantin por señalar que un simple cambio de $.post a $.ajax para enviar mi Knockout.js ver modelo de mi mvc acción era todo lo que necesitaba!Aquí el $.ajax código que estoy usando:
$.ajax({
type: "POST",
url: "/MyController/MyAction",
data: ko.toJSON(viewModel),
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function (data) {
$("#resultCount").html(data);
}
});
Solución
Usted no puede usar $.post usted necesita ir para el subyacente $.ajax y agregar la correcta contenttype para hacer mvc aceptar la publicación de json y hacer el modelo de enlace (contenttype debe ser "application/json;charset=utf-8") google y verás un montón de ejemplos