2012-11-02 13 views
8

Próbuję POST obiekt JSON (model nokaut JSON-ified, jeśli to ma jakąkolwiek istotność) do mojego kontrolera MVC, i kontroler zwróci nowy widok. Aby to zrobić, wysyłam dane za pomocą formularza. Problem polega na tym, że chciałbym, aby JSON automatycznie przekształcał się w model, gdy kontroler go odbierze.Wysyłaj dane JSON przez formularz w MVC4

Gdybym miał użyć wywołanie AJAX dla tego,

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

... obiekt JSON powodzeniem rozszeregować i przekształcony instancji mojej klasie modelu.

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

Jeśli chcę zrobić to z formą, rozumiem, że muszę włożyć JSON w polu wejściowym ukrytym, ale najlepiej można zarządzać, gdy robi to, aby odbierać dane jako odcinkach łańcucha :

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

public ActionResult Preview(string hiddenFieldName) { ... } 

może po prostu deserializować go potem, ale ja naprawdę woleliby, gdyby MVC mogłyby przekształcić go dla mnie, jak to będzie z wywołania AJAX. czy to możliwe?

Dzięki.

Odpowiedz

2

Zakładając chcesz opublikować dane zakodowane jako json używając formy i nie XHR, nie sądzę, że to po wyjęciu z pudełka możliwe.

Formularze nie zezwalają na wiele typów zawartości. http://www.w3.org/TR/html401/interact/forms.html#form-content-type

Jeśli opublikujesz json jako ciąg, prawdopodobnie będzie można utworzyć segregator modelowy, który będzie szukał ciągów, które wyglądają jak json i zajmują się deserializacją. Nie jest to najładniejsza rzecz, zwłaszcza jeśli jest to sytuacja wyjątkowa.

+0

Dzięki za wejście. Chyba po prostu wyślę to jako ciąg. To nie koniec świata, ponieważ mogę przywrócić ten sam JSON z powrotem na nowej stronie, ale miałem nadzieję, że uda mi się uczynić działanie Preview zgodne z resztą kontrolera. – Alejo

0

Zamiast ręcznej deserializacji można przechwycić zdarzenie formularza i zrekonstruować własny wpis, dodając dodatkowy obiekt JSON. Oto przykład, który wykorzystuje metodę serializeObject z this post):

$(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... 
      } 
     }); 
    }); 
}); 
+0

Nie mogę przechwycić i zrekonstruować żądania wpisu formularza, ponieważ potrzebuję danych do synchronicznego przesłania do kontrolera. Na przykład. Formularz przesyła dane -> kontroler odbiera dane (idealnie serializowane do mojej klasy modelu) -> kontroler zwraca dane na nowej stronie internetowej. – Alejo

Powiązane problemy