2009-07-08 23 views
12

Mam widok, który składa się z nagłówków górnego, lewego i dolnego oraz głównego panelu zawartości. Załóżmy, że podczas żądania AJAX muszę zaktualizować kod HTML górnego, dolnego i głównego panelu (lewy nagłówek powinien pozostać taki sam).ASP.NET MVC i AJAX

Zastanawiam się, jaki byłby najlepszy sposób, aby to osiągnąć. Pierwsza myśl polegała na tym, aby panel główny był częściowy i miał działanie kontrolera, które zwróciłoby PartialView. Nie zadziałałoby to, ponieważ ponieważ akcja zwraca tylko HTML głównego panelu, nie mogę zaktualizować nagłówków górnego i dolnego.

Więc jeśli umieściłem nagłówek górny i dolny w ich odpowiednich widokach częściowych, potrzebuję działania kontrolera, aby zwrócić wiele widoków częściowych. Czy to w ogóle możliwe, czy robię coś zupełnie poza torem?

Zobaczyłem, że jest możliwe render a partial view to a string, więc pomyślałem, że mogę użyć tej techniki w akcji, aby zwrócić obiekt JSON z 3 właściwościami reprezentującymi HTML 3 części, które muszę zaktualizować. Ale wydaje mi się, że to bardzo złe podejście do mnie, jeśli to możliwe.

Innym pomysłem było zwrócenie obiektu JSON zawierającego tylko dane niezbędne dla części i użycie javascript do skonstruowania HTML. Ale budowanie interfejsu użytkownika w javascriptu wygląda jak trudna praca (główna treść częściowo korzysta z MvcContrib's GridView z stronicowaniem i sortowaniem).

Tak więc naprawdę doceniłbym sugestie dotyczące najczystszego podejścia do obsługi takiego scenariusza. Również adaptacyjne rozwiązanie byłoby świetne: na przykład, jeśli użytkownik ma wyłączony javascript , po prostu przeładuje całą stronę bez AJAX.


UPDATE:

Andrew Siemersuggested umieszczenie każdej sekcji do własnej częściowym i wykonać wiele żądań AJAX. Wydaje się, że jest to całkowicie poprawne podejście, ale niestety nie ma ono zastosowania w moim scenariuszu ze względu na następujące szczegóły, które pominąłem w moim początkowym opisie problemu: górny nagłówek jest rzeczywiście używany do wyświetlania komunikatów o błędach/informacjach o zdarzeniach występujących w głównym panelu. Tak na przykład muszę wyświetlić komunikat o błędzie na wypadek, gdyby wyjątek został zgłoszony podczas pobierania modelu dla głównego panelu. Tak więc można było wykonać tylko jedno żądanie w celu zaktualizowania tych dwóch paneli.

+0

można rzucić okiem na ten temat: http://stackoverflow.com/questions/7086440/mvc-validating-binded- to-entitiy-with-reference-to-other-ens pls (nie mam pojęcia jak się z tobą skontaktować bezpośrednio) :) thnx – cpoDesign

Odpowiedz

9

Możesz z łatwością umieścić każdą sekcję w swoim własnym częściowym widoku. Umożliwiłoby to wykonanie żądania jQuery dla każdego widoku po przesłaniu lub zmianie danych. Każde połączenie można następnie przekazać do odpowiedniej sekcji. Jest to bardzo wykonalne i brzmi jak odpowiednia ścieżka.

Nie oczekuję, że kontroler zwróci wiele widoków częściowych ... ponieważ spowoduje to przerwanie SRP!

Aktualizacja: w następstwie aktualizacji ... nadal można pobrać sekcje osobno. To po prostu wymaga nieco więcej chłodu ajax z twojej strony, ponieważ każde pobranie może zwrócić porcję błędu (na żądanie JSON). Jeśli wystąpi jakikolwiek błąd, wówczas te komunikaty o błędach mogą być wyświetlane w nagłówku. Lub ... możesz ustawić żądanie nagłówka jako ostatnie, gdy wszystkie pozostałe żądania zostały zgłoszone, w którym to przypadku każdy częściowy widok może przesłać komunikaty o błędach do zmiennej sesji dla stanu błędu ..., a następnie pokazać te wiadomości w Nagłówek.

Duży powód, by wybrać opcję z każdą sekcją, ponieważ jest to osobna sekcja, a nie jedno żądanie uber, może nie być jeszcze widoczne w pierwotnym projekcie.Każdą sekcję można kontrolować osobno, dzięki czemu można dowolnie wykonywać różne czynności, np. Buforować każdą sekcję niezależnie, zapewniając częstsze aktualizacje w jednym obszarze nad drugim, itp.

+0

Dzięki za podpowiedź Andrew. Niestety w początkowym opisie pominięto ważny szczegół, dlatego obawiam się, że tej sugestii nie można zastosować w moim scenariuszu. Odpowiednio zaktualizowałem moje pytanie. –

0

To jest trudne. Co powiesz na to?

Skonfiguruj partial request dla każdego komponentu, górny, lewy, główny, z którego każdy zwraca częściowy widok z danymi wymaganymi dla tego obszaru. Za każdym razem, gdy w głównym panelu pojawi się zdarzenie, należy odświeżyć części w każdym obszarze, aby je zaktualizować.

Alternatywnie można je wszystkie na stałych licznikach do sondowania nowych danych.

0

Co powiesz na uwzględnienie górnego i prawego widoku w ukrytych elementach div w głównym widoku i przeniesienie ich we właściwe miejsca na ładunek?

0

Wiem, że to pytanie zostało odebrane, ale myślałem, że po prostu Boisko w sugestię:

  • backbone.js i jQuery szablonów rozwiąże swoje problemy łatwo.

(Tylko zostawię to tutaj jako sugestię dla ludzi czytających to pytanie)