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);
    }
});
¿Fue útil?

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top