2011-05-17 22 views
5

Mam formularz utworzony za pomocą Knockout.js. Kiedy użytkownik naciśnie przycisk Prześlij, przekonwertuję model widoku z powrotem na model i próbuję przesłać go na serwer. Próbowałem:Prześlij json do akcji MVC3

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

Ale obiekt był pusty, gdy trafił na serwer. Przeszedłem do tego kodu:

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

który pobiera dane do serwera z poprawnymi danymi w nim.

Ale chciałbym, aby dane zostały przesłane, więc mój kontroler może przekierować do prawidłowego widoku. Wszelkie sugestie?

Odpowiedz

11

Steve Sanderson ma starszą próbkę, która demonstruje coraz przedstawionych danych JSON być odpowiednio oprawione w swojej akcji kontrolera tutaj: http://blog.stevensanderson.com/2010/07/12/editing-a-variable-length-list-knockout-style/

Istotą jest to, że tworzy atrybut o nazwie „FromJson”, który wygląda następująco:

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

Następnie działania wygląda następująco:

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

teraz można użyć ko.utils.postJson do przedstawienia swoich danych i odpowiedzieć odpowiednim widokiem.

+0

który pracował wielkie dzięki. Podążałem za przykładem, o którym wspomniałeś. Brakowało mi części atrybutu. –

-2

Również, to w przytoczonym przykładzie, ale może trzeba zmienić swój apel JavaScript, żeby coś takiego:

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

To jest właściwie niepoprawne. – youwhut

+1

Zostało to uwzględnione w poście w drugiej odpowiedzi. –

Powiązane problemy