Domanda

Ho una visualizzazione MVC modello che assomiglia a questo:

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

Il CountriesCollection oggetto (linea 9) assomiglia a questo:

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

Ora, sto creando una nuova istanza di CountriesCollection e quindi l'aggiunta di un vuoto istanza di DirectorySearchModel modello di visualizzazione e quindi serialising tutto in un javascript modello di visualizzazione per 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"}]
}

Le mie caselle di controllo sono reso: <input checked="checked" data-bind="checked: Countries.arrCountries" id="Countries_arrCountries30" name="Countries.arrCountries" type="checkbox" value="1">.Il controllo di un paio significa che si finisce con questo Knockout.js modello di visualizzazione:

{
"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"}]
}

Invio il mio punto di vista (ovverotramite un pulsante di invio e non con Knockout.js) per un MVC azione che prevede un DirectorySearchModel, Posso chiedere model.Countries.arrCountries per ottenere un elenco di elementi verificati, ma quando uso...

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

o...

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

un'altra azione che si aspetta lo stesso DirectorySearchModel, model.Countries.arrCountries è sempre null!Mi chiedevo se è a causa di Knockout.js l'invio dell' arrCountries voci string[]s quando MVC è in attesa di int[]s, ma di cambiare la mia MVC codice aspettarsi string[]s non sembra cambiare di molto..!Il CountriesCollection oggetto entro il DirectorySearchModel sembra esistere, ma è il arrCountries entro sempre null.

Tutte le idee?Qualsiasi aiuto molto apprezzato!

Modifica

L'azione che riceve il Knockout.js viewModel:

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

Il getResultCount metodo:

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

RISOLTO!

Grazie a Konstantin per sottolineando che un semplice interruttore da $.post di $.ajax per inviare il mio Knockout.js modello di visualizzazione torna al mio mvc azione era tutto ciò che era necessario!Ecco il $.ajax codice che sto 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);
    }
});
È stato utile?

Soluzione

Si può usare $.post hai bisogno di andare per la sottostante $.ajax e aggiungere il corretto contenttype per rendere mvc accettare l'inviato json e fare il modello di associazione (contenttype dovrebbe essere "application/json;charset=utf-8") su google e vedrete un sacco di esempi

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top