Jestem programistą Java, nowym w .NET. Pracuję nad projektem .NET MVC2, w którym chcę mieć częściowy widok do zawijania widżetu. Każdy obiekt widgetu JavaScript zawiera obiekt danych JSON, który zostałby zapełniony danymi modelu. Następnie metody aktualizowania tych danych są powiązane ze zdarzeniami w przypadku zmiany danych w widgecie lub w przypadku zmiany tych danych w innym widgecie.
Kod wygląda mniej więcej tak:
MyController
:
virtual public ActionResult DisplaySomeWidget(int id) {
SomeModelView returnData = someDataMapper.getbyid(1);
return View(myview, returnData);
}
myview.ascx
:
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<SomeModelView>" %>
<script type="text/javascript">
//creates base widget object;
var thisWidgetName = new Widget();
thisWidgetName.updateTable = function() {
// UpdatesData
};
$(document).ready(function () {
thisWidgetName.data = <% converttoJSON(model) %>
$(document).bind('DATA_CHANGED', thisWidgetName.updateTable());
});
</script>
<div><%:model.name%></div>
Nie wiem, jak przesłać dane jako, SomeModelView
a następnie móc ich użyć do wypełnienia widżetu, a także przekonwertować go na JSON. Widziałem naprawdę proste sposoby, aby to zrobić w kontrolerze, ale nie w widoku. Myślę, że to podstawowe pytanie, ale od kilku godzin próbuję zrobić to gładko.
.net
javascript
asp.net-mvc
json
Chris Stephens
źródło
źródło
Odpowiedzi:
W mvc3 z brzytwą
@Html.Raw(Json.Encode(object))
wydaje się działać.źródło
Json.Serialize
zamiast Encode.Dobra robota, dopiero zacząłeś używać MVC i znalazłeś pierwszą poważną wadę.
Naprawdę nie chcesz konwertować go do formatu JSON w widoku i tak naprawdę nie chcesz konwertować go w kontrolerze, ponieważ żadna z tych lokalizacji nie ma sensu. Niestety utkniesz w tej sytuacji.
Najlepszą rzeczą, jaką znalazłem, jest wysłanie JSON do widoku w ViewModel, na przykład:
następnie użyj
Twoim zdaniem. Należy pamiętać, że standardowy .NET JavaScriptSerializer jest dość gówniany.
zrobienie tego w kontrolerze przynajmniej czyni go testowalnym (chociaż nie dokładnie tak jak powyżej - prawdopodobnie chcesz wziąć ISerializer jako zależność, abyś mógł go kpić)
Zaktualizuj również, jeśli chodzi o JavaScript, dobrą praktyką byłoby owinięcie WSZYSTKICH widgetów JS, które masz powyżej, w następujący sposób:
w ten sposób, jeśli umieścisz wiele widżetów na stronie, nie wystąpią konflikty (chyba że potrzebujesz dostępu do metod z innego miejsca na stronie, ale w takim przypadku i tak powinieneś zarejestrować widżet w jakimś frameworku widżetów). To może nie być teraz problemem, ale dobrym zwyczajem byłoby dodanie nawiasów teraz, aby zaoszczędzić sobie dużo wysiłku w przyszłości, kiedy stanie się to wymaganiem. Dobrą praktyką OO jest również hermetyzowanie funkcjonalności.
źródło
JavaScriptSerializer
lubReturn Json(object)
oba używają tych samych serializatorów. Również wysłanie tego samego kodu JSON z powrotem do kontrolera spowoduje odbudowanie obiektu, o ile zdefiniujesz prawidłowy model. Może podczas MVC2 była to poważna wada… ale dzisiaj jest to bardzo proste i wygodne. Zaktualizuj swoją odpowiedź, aby to odzwierciedlić.Okazało się, że całkiem fajnie jest to zrobić w ten sposób (użycie w widoku):
Oto odpowiednia metoda pomocnika Klasa rozszerzenia:
Nie jest to zbyt skomplikowane, ale rozwiązuje problem, gdzie go umieścić (w kontrolerze czy na widoku?) Odpowiedź oczywiście brzmi: ani;)
źródło
Możesz użyć
Json
bezpośrednio z akcji,Twoje działanie wyglądałoby mniej więcej tak:
Edytować
Właśnie zobaczyłem, że zakładasz, że to jest
Model
View, więc powyższe nie jest do końca poprawne, musiałbyś wykonaćAjax
wywołanie metody kontrolera, aby to uzyskać,ascx
nie miałby wtedy modelu jako takiego, zostawię swój kod na wszelki wypadek, gdyby było to przydatne i możesz zmienić wezwanieEdytuj 2 po prostu umieść identyfikator w kodzie
źródło
@ Html.Raw (Json.Encode (obiekt)) może służyć do konwersji obiektu modalnego widoku do formatu JSON
źródło
Zobacz https://highspeedlowdrag.wordpress.com/2014/08/23/mvc-data-to-jquery-data/
Zrobiłem poniżej i działa jak urok.
<input id="hdnElement" class="hdnElement" type="hidden" value='@Html.Raw(Json.Encode(Model))'>
źródło
Przedłużenie wspaniałej odpowiedzi od Dave'a . Możesz utworzyć prosty HtmlHelper .
Twoim zdaniem:
W ten sposób możesz scentralizować logikę tworzenia JSON, jeśli z jakiegoś powodu chciałbyś zmienić logikę później.
źródło
Andrew miał świetną odpowiedź, ale chciałem ją trochę poprawić. Różnica polega na tym, że wolę, aby moje ModelViews nie zawierały danych ogólnych. Tylko dane dotyczące obiektu. Wydaje się, że ViewData pasuje do rachunku za dane ogólne, ale oczywiście jestem w tym nowy. Proponuję zrobić coś takiego.
Kontroler
Widok
To daje ci te same dane w twoim JSON, co w twoim ModelView, więc możesz potencjalnie zwrócić JSON z powrotem do twojego kontrolera i będzie miał wszystkie części. Jest to podobne do żądania tego za pośrednictwem JSONRequest, ale wymaga jednego wywołania mniej, więc oszczędza ci tego narzutu. Przy okazji, to jest fajne dla randek, ale wydaje się, że to kolejny wątek.
źródło