2012-10-11 62 views
5

Czytałem ten artykuł z firmy Microsoft na temat zarządzania państwem.Przechowywanie datatable w ViewState

http://msdn.microsoft.com/en-us/library/75x4ha6s(v=vs.100).aspx

znalazłem ciekawą rzecz tutaj. ViewState jest klasyfikowane jako opcja po stronie klienta (chociaż już to wiedziałem). Przypomina mi nasz kod w aplikacji.

DataTable dt = getDatatableFromDB(); 
ViewState["dataTable"] = dt; 

I ten kod działa dobrze w tej chwili.

Moja dezorientacja jest:

  1. W jaki sposób obiekt po stronie klienta (ViewState) zapisać obiekt po stronie serwera (DataTable)?
  2. Czy dobrą praktyką jest używanie ViewState do przechowywania dużych obiektów, takich jak pliki danych?
  3. Co może być efektem ubocznym (jeśli występuje), jeśli nadal stosujemy takie podejście?
+5

Downwotarzy - jeśli nie zostawisz komentarzy, PO nigdy nie nauczy się zadawać lepszych pytań. Osobiście nie widzę problemu z tym pytaniem. Uważam, że jest to przydatne dla społeczności, więc dodaję +1, aby zrównoważyć różne rzeczy. – JDB

+1

@ Cyborgx37 Świat jest lepszym miejscem do życia z powodu ludzi takich jak Ty. Jestem całkiem nowy w tej technologii i staram się uczyć i usuwać moje pomieszanie. Właśnie dlatego zadaję takie pytania. Ale niektórzy Downwotnicy myślą, że to, co im znane, jest znane wszystkim i nikt nie powinien zadawać tego pytania. Przypomina mi chińskie przysłowie: "Ten, który zadaje pytanie, jest głupcem przez pięć minut, ten, kto nie zadaje pytania, pozostaje głupcem na zawsze". Lolz –

+0

Dzięki, ale jest tak naprawdę standard, według którego można oceniać dobre/złe pytania - co oznacza, że ​​nie wszystkie pytania dotyczące StackOverflow są mile widziane (zobacz http://stackoverflow.com/questions/how-to-ask). Po prostu nie widzę problemu z twoją. – JDB

Odpowiedz

8

Stan widoku jest przechowywany w ukrytej plakietce <input /> w formularzu. Kiedy użytkownik inicjuje odświeżenie (na przykład przez kliknięcie przycisku), dane są zwracane na serwer jako część danych formularza.

Jeśli przechowujesz duże ilości danych w ViewState, poniesiesz karę zarówno wtedy, gdy użytkownik spróbuje pobrać stronę (ponieważ wszystkie te dane będą częścią HTML), jak i gdy użytkownik spróbuje przesłać formularz (ponieważ wszystkie te dane muszą zostać przesłane z powrotem na serwer).

Ponadto łatwo można zgasić wskaźnik ViewState. Zachowuje się tylko wtedy, gdy użytkownik przesyła formularz. Jeśli użytkownik kliknie hiperłącze na innej stronie, formularz nigdy nie zostanie przesłany, a wszystkie dane zawarte w obiekcie ViewState zostaną utracone. Jest to prawdą, nawet jeśli znacznik zakotwiczenia wskazuje na stronę, na której aktualnie się znajduje.

Widzę z Twojego previous question, że próbujesz znaleźć dobre miejsce na umieszczenie swoich DataTables. ViewState nie jest najgorszym miejscem, o ile dane są stosunkowo małe. Base64 jest lepszy niż XML pod względem wykorzystania pamięci, ale nadal jest daleka od wydajności. Jeśli dane są dość statyczne, możesz rozważyć ich zapisanie w numerze ApplicationState. Jeśli edytujesz DataTable za pomocą GridView, to GridView faktycznie przechowuje już DataTable dla ciebie, do którego możesz uzyskać dostęp poprzez właściwość DataSource (po prostu wyślij ją z powrotem do DataTable).


Warto również zauważyć, że podczas gdy dane ViewState jest zakodowany w base64 (czyli przeciętny użytkownik nie będzie w stanie go zrozumieć), może być łatwo edytowane przez określony użytkownik. Pozornie nieszkodliwe dane można edytować, aby stać się szkodliwym dla Twojej witryny. To jest klasyczna droga do hakowania strony, więc musisz być bardzo ostrożny, jakie dane dokładnie przechowujesz. Na przykład, jeśli przechowujesz identyfikator użytkownika w ViewState, użytkownik może edytować identyfikator i włamać się na konto innego użytkownika. (Uwaga: jest to tylko problem jeśli EnableViewStateMac został ustawiony na False.)

+1

Nota boczna: Jest serializowana do wartości wejściowej i deserializowana w drodze powrotnej. –

+0

@ Cyborgx37, Czy włącza pomoc ViewStateMAC w przypadku edycji ViewState? –

+1

Tak, 'EnableViewStateMac' pójdzie daleko w kierunku zapobiegania włamaniom do ViewState. – JDB

4

1) W jaki sposób obiekt po stronie klienta (ViewState) zapisać po stronie serwera obiektu (DataTable)?

Jest serializowany.

2) Czy warto używać ViewState do przechowywania dużych obiektów, takich jak pliki danych?

To zależy od środowiska i wymagań.

3) Co może być efektem ubocznym (jeśli występuje), jeśli nadal stosujemy takie podejście?

Wiele danych przejdzie przez przewód. To może spowolnić sprawę.

+3

Kolejna uwaga dodatkowa: Serializowanie dużego obiektu spowoduje spowolnienie. Nie tylko przeniesienie drutu. –