2011-05-17 20 views
5

Tengo un formulario creado con Knockout.js. Cuando el usuario presiona el botón de enviar, vuelvo a convertir el modelo de vista en un modelo y estoy tratando de enviarlo al servidor. Intenté:Enviar json a la acción de MVC3

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

Pero el objeto estaba en blanco cuando golpeó el servidor. Cambié a este código:

$.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"); } 
}); 

Eso obtiene los datos del servidor con los datos correctos.

Pero lo que me gustaría es tener los datos enviados para que mi controlador pueda redireccionar a la vista correcta. ¿Alguna sugerencia?

Respuesta

11

Steve Sanderson tiene una muestra más antigua que demuestra consiguiendo presentó datos JSON se registre correctamente en su acción del controlador aquí: http://blog.stevensanderson.com/2010/07/12/editing-a-variable-length-list-knockout-style/

El quid de la cuestión es que se crea un atributo llamado "FromJson" que se parece a:

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

Entonces, la acción se ve como:

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

Ahora, se puede usar ko.utils.postJson a presentar sus datos y responder con una vista apropiada.

+0

Eso funcionó muy bien gracias. Estaba siguiendo el ejemplo que mencionaste. Me perdí la parte del atributo. –

-2

Además, es en el ejemplo mencionado, pero puede que tenga que modificar su llamada JavaScript para algo como:

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

Esto es realmente incorrecto. – youwhut

+1

Esto fue cubierto en la publicación en la otra respuesta. –

Cuestiones relacionadas