2011-05-17 18 views
5

Ho un modulo creato con Knockout.js. Quando l'utente preme il pulsante di invio, converto il modello di visualizzazione in un modello e sto tentando di inviarlo al server. Ho provato:Invia azione json a MVC3

ko.utils.postJson(location.href, ko.toJSON(viewModel)); 

Ma l'oggetto era vuoto quando ha colpito il server. Ho passato a questo codice:

$.ajax({ 
    url: location.href, 
    type: "POST", 
    data: ko.toJSON(viewModel), 
    datatype: "json", 
    contentType: "application/json charset=utf-8", 
    success: function (data) { alert("success"); }, 
    error: function (data) { alert("error"); } 
}); 

Questo ottiene i dati al server con i dati corretti in esso.

Ma quello che vorrei è avere i dati inviati in modo che il mio controller possa reindirizzare alla vista corretta. Qualche suggerimento?

risposta

11

Steve Sanderson ha un campione di anziani che illustra sempre presentato i dati JSON di essere vincolato correttamente nella vostra azione di controllo qui: http://blog.stevensanderson.com/2010/07/12/editing-a-variable-length-list-knockout-style/

L'essenza di esso è che egli crea un attributo chiamato "FromJson" che assomiglia:

public class FromJsonAttribute : CustomModelBinderAttribute 
{ 
    private readonly static JavaScriptSerializer serializer = new JavaScriptSerializer(); 

    public override IModelBinder GetBinder() 
    { 
     return new JsonModelBinder(); 
    } 

    private class JsonModelBinder : IModelBinder 
    { 
     public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
     { 
      var stringified = controllerContext.HttpContext.Request[bindingContext.ModelName]; 
      if (string.IsNullOrEmpty(stringified)) 
       return null; 
      return serializer.Deserialize(stringified, bindingContext.ModelType); 
     } 
    } 
} 

Poi, l'azione appare come:

[HttpPost] 
    public ActionResult Index([FromJson] IEnumerable<GiftModel> gifts) 

Ora, è possibile utilizzare ko.utils.postJson per inviare i tuoi dati e di rispondere con una vista appropriata.

+0

Che ha funzionato grande grazie. Stavo seguendo l'esempio che hai citato. Ho perso la parte dell'attributo. –

-2

Inoltre, è nell'esempio citato, ma potrebbe essere necessario modificare la chiamata JavaScript a qualcosa di simile:

ko.utils.postJson(location.href, { viewModel: this.viewModel }); 
+0

Questo è in realtà non corretto. – youwhut

+1

Questo è stato coperto nel post nell'altra risposta. –