MVC - wysyłanie json podczas wysyłania formularza na serwer

0

Witam,

W aplikacji MVC5 mam stworzony formularz który jest wysyłany POSTem do serwera (klasyczne form submit, bez ajaxa itp). Na stronie będzie dodany skrypt który będzie funkcjonował podczas wypełniania przez użytkownika formularza. Podczas form submit JSON który jest efektem pracy tego skryptu powinien być wysłany do kontrolera, przeparsowany i przetworzony. CHodzi mi o uzyskanie efektu normalnego form submit rozszerzonego o dodatkowe dane JSON. W jaki sposób to osiągnąć ?

Myślałem o Html.HiddenFor(...) i zapisywaniu efektu działania skryptu na bieżąco do niego. Wartość byłaby ładowana do obiektu ViewModel podczas wywołania akcji kontrolera. Jednak coś mi mowi że to niezbyt dobre rozwiązanie. Czy można to zrobić w bardziej elegancki sposób , tak żeby wykorzystać wbudowany w MVC ModelBinding ?

1

To zadziała automatycznie - jeśli ten HiddenFor będzie w obrębie forma, to submit wyśle go do akcji kontrolera, a model binder ustawi jego wartość do odpowiedniego pola viewmodelu.

0

TAk to wiem i takie zachowanie chcę wykorzystać. Zastanawiam się po prostu czy zapisywanie JSON będącego efektem skryptu w polu Hidden, jago deserializacja do obiektu w kontrolerze (po przekazaniu formularza i bindowaniu modelu) jest dobrym rozwiązaniem. Czy nie ma bardziej eleganckiego sposobu.

0

Jeśli chcesz, aby zadziałało to magicznie, to nie zapisuj JSON tylko dane w hiddenie (albo wielu hiddenach). Jeśli to musi być JSON, i chcesz eleganckiego rozwiązania, to napisz własny ModelBinder i użyj go dla tej akcji kontrolera. Pomyśl o tym, aby pole ViewModelu udekorować odpowiednim atrybutem, aby Twój ModelBinder mógł rozpoznać, że to akurat pole musi zdedżejsonować.

Ale jeśli to tylko jednorazowa akcja i nie chce Ci się bawić, to możesz też deserializować w kontrolerze.

0

Nie musi być JSON, ale ze skryptu JS potrzebuję zwrócić tablicę prostych obiektów (małą, ale dynamiczną więc kilka hiddenów po jednym na każdy obiekt odpada). Czyli rozumiem że robię sobie swój ModelBinder i w nim parsuję pole hidden z JS i do kontrolera mogę zwrócić już przeparsowany obiekt.

A jakie są jesczze alternatywy ? - np zamiast mogę zamiast zwykłego submit formy, wymusić serializowanie całego formularza do json i jego wysłac do kontrolera jako post z doklejonymi danymi ? MVC da sobie radę z przeźroczystym serializowaniem takiego ViewModelu z doklejonymi danymi ?

0

Domyślny model binder obsługuje jedynie typy proste, tablice i listy, i wszystkie wartości przesyłane czystym tekstem. Nie zdekoduje JSONa sam z siebie. Jeśli wyślesz całość jako JSON, a w kontrolerze będziesz chciał przyjąć viewmodel, a nie string, to i tak będziesz musiał napisać swój własny model binder.

1 użytkowników online, w tym zalogowanych: 0, gości: 1