asp.net-mvc json knockout.js asp.net-mvc-4

asp.net mvc - Publicar datos JSON a través de un formulario en MVC4



asp.net-mvc knockout.js (2)

Estoy tratando de POSTAR un objeto JSON (un modelo JSON-ified knockout, si eso es de alguna relevancia) para mi controlador MVC, y hacer que el controlador devuelva una nueva vista. Para hacer esto, estoy enviando los datos con un formulario. El problema es que me gustaría que el JSON se convierta automáticamente en un modelo cuando el controlador lo reciba.

Si tuviera que usar una llamada AJAX para esto,

var actionModel = new Object(); actionModel.Controls = ko.toJS(self.controls()); var json = JSON.stringify(actionModel); $.ajax({ url: "MyController/Preview", type: "POST", contentType: ''application/json; charset=utf-8'', cache: false, data: json, success: function (data) { } });

... el objeto JSON se deserializa con éxito y se convierte en una instancia de mi clase de modelo.

public ActionResult Preview(ActionModel actionModel) { ... } public class ActionModel { public List<ControlModel> Controls { get; set; } }

Si quiero hacer esto con un formulario, entiendo que necesito insertar el JSON en un campo de entrada oculto, pero lo mejor que puedo hacer al hacer esto es recibir los datos como una cadena serializada:

@using (Html.BeginForm("Preview", "MyController", FormMethod.Post, new { id = "previewForm" })) { <input type="hidden" id="hiddenFieldName" /> } public ActionResult Preview(string hiddenFieldName) { ... }

Podría deserializarlo después, pero realmente lo preferiría si MVC pudiera convertirlo para mí, como lo haría con una llamada AJAX. es posible?

Gracias.


Suponiendo que desea publicar datos codificados como json utilizando un formulario y no XHR, no creo que sea posible.

Las formas no permiten muchos tipos de contenido. http://www.w3.org/TR/html401/interact/forms.html#form-content-type

Si publica json como una cadena, probablemente sea posible crear una carpeta de modelo que busque cadenas que parezcan ser json y que se ocupen de la deserialización allí. No es lo más bonito, especialmente si esto es solo para una situación extraña.


En lugar de la deserialización manual, puede capturar el evento de publicación de formulario y reconstruir su propia publicación, agregando el objeto JSON adicional. Aquí hay un ejemplo que usa el método serializeObject de esta publicación ):

$(document).ready(function () { $(''form'').live(''submit'', function (e) { e.preventDefault(); var dataToPost = $(this).serializeObject(); dataToPost.hiddenFieldName = actionModel; //additional object here $.ajax({ type: $(this).attr(''method''), url: $(this).attr(''action''), data: JSON.stringify(dataToPost), contentType: ''application/json; charset=utf-8'', success: function (res) { //do something... } }); }); });