2009-09-19 13 views
9

Jak mogę zachować obiekty między stronami postów strony ASP.NET?ASP.NET: Jak mogę zachować obiekty między wysyłkami zwrotnymi?

Mam stronę internetową ASP.NET. Kiedy klikam jeden przycisk asp.net, zadzwonię do mojej funkcji (Save), która utworzy obiekt mojej niestandardowej klasy (klasa UserDetails) i zapisze szczegóły do ​​DB. więc jest to powrót z powrotem. Po powrocie ponownie ta sama strona zostanie wyświetlona użytkownikowi. W tym czasie chcę wziąć obiekt użytkownika, który utworzyłem w pierwszej funkcji (Zapisz). Jaki jest najlepszy sposób na zrobienie tego? Wiem, że mogę to zapisać w sesji i uzyskać do niego dostęp. Ale chcę wiedzieć, czy jest jakiś inny lepszy sposób?

Odpowiedz

3

Podejście szukasz jest pewnego rodzaju mechanizm wiązania z danymi, który wiąże wartości obiektu (można załadować z db, jeśli już istnieje) do formularza internetowego asp.net.

Zasadniczo trzeba było następujące:

  1. wyświetlać pustego formularza internetowego z pól tekstowych (tj) do swojej właściwości obiektu
  2. Użytkownik wypełni formularz i naciśnij przycisk Zapisz
  3. Wówczas nastąpi odświeżenie. Na stronie PageLoad można wykryć, czy jest to odświeżenie z Page.IsPostback, a jeśli tak, to utworzyć nowy obiekt i wypełnić go wartościami wprowadzonymi przez użytkownika.
  4. W OnClick swojej przycisku wywołać odpowiednią metodę BL do przechowywania go w dół do DB

Wygląda to następująco (piszę to z mojej głowy bez kompilatora, więc zadbać :))

public partial class MyPage : Page 
{ 

    private Person myPersonObj; 

    protected void Page_Load(...) 
    { 

     if(!Page.IsPostback) 
     { 
      //this is not a postback, so you may load an object based on an ID (i.e. in QueryString or create a new one 
      myPersonObj = new Person(); 
     } 
     else 
     { 
      //it is a postback, so unbind the values 
      myPersonObj = new Person(); 
      Unbind(); //the myPersonObj will be filled, the values are managed by ASP.net in the ViewState 
     } 

    } 

    //caution, overriding Page.DataBind() 
    private override void DataBind() 
    { 
     textBoxFirstname.Text = myPersonObj.FirstName; 
     ... 

    } 

    private void Unbind() 
    { 
     myPersonObj.FirstName = textBoxFirstname.Text; 
    } 

    protected void btnSubmit_OnClick(...) 
    { 
     if(Page.IsValid) 
     { 
      Save(); 
     } 
    } 

    private void Save() 
    { 
     //ideal layering with Interfaces 
     IPersonBL personBL = MyBLFactory.Get<IPersonBL>(); 
     personBL.SavePerson(myPersonObj); //call the BL for further validation and then persisting 
    } 
} 

chciałem dodać wczoraj, ale zapomniał, ponieważ musiałem się spieszyć:
można również przechowywać swoje obiekty w ViewState lub sesji jak opisano inne, ale mam doświadczenie, które powinno zrobić tak rzadko, jak to możliwe, z powodu następujących "wad" (z mojego punktu widzenia):

  • Twoje obiekty muszą być serializable
  • Przechowywanie w ViewState będzie drammatically zwiększyć wielkość swojej stronie, a tym samym spowalnia ładowanie strony. Zauważ, że parametr ViewState jest przesyłany do klienta i z powrotem za każdym razem, gdy występuje "odświeżenie". Jeśli jest to jedyna możliwość i występują problemy z wydajnością, możesz wziąć pod uwagę trying this (ale to powinno być wyjątkiem!)
  • Przechowywanie obiektów w sesji może spowodować obciążenie po stronie serwera, zużywając tam pamięć. Powinieneś być ostrożny w przechowywaniu obiektów w swojej sesji i być może także dbać o zniszczenie tych obiektów, jeśli wiesz, że ich już nie potrzebujesz.

Zaletą opisywanego przeze mnie "wiązania danych" jest to, że nie występują takie problemy z "wadą" posiadania nowego świeżego obiektu za każdym razem. W związku z tym należy zadbać o obsługę stanu obiektu, tj. Ręczne przechowywanie identyfikatorów przez obie wizyty itd.

3

Możesz przechowywać obiekt w ViewState, będzie to magazyn specyficzny dla strony. Obiekt zostanie następnie przekształcony do postaci szeregowej i wstrzyknięty do stanu wyświetlania strony, co spowoduje powiększenie strony.

Przechowywanie obiektu w sesji powoduje, że strona jest mniejsza, ale zużywa zasoby pamięci serwera.

Alternatywnie można za każdym razem odczytać obiekt z bazy danych. Ma to tę zaletę, że wyświetla użytkownikowi dokładnie to, co zostało zapisane w bazie danych.

7

Inną opcją jest przechowywanie obiektu w pamięci podręcznej za pomocą unikalnego klucza (np. "Użytkownik" + identyfikator) i przechowywanie jego identyfikatora w bieżącej sesji lub w ViewState. Podczas odświeżenia możesz pobrać obiekt z pamięci podręcznej.

Z takim podejściem masz kilka zalet:

  • masz mniej danych w sesji lub w ViewState
  • czy odświeżenie strony jest wykonana, trzeba tylko wejść do DB, jeśli obiekt nie jest dłużej w pamięci podręcznej
  • jeśli nie odświeżenie strony jest wykonany, obiekt zostanie ostatecznie usunięta z pamięci podręcznej (zwalniając pamięć)
-1

w interfejsie Wykonaj

UserDetail userDetail = new UserDetail(); 
    //do your stuff 
    userDetail = UserBL.TransferUserData(userDetail); 

    //do your stuff 

W BL

public static UserDetail TransferUserData(UserDetail userDetail) 
{ 
    // do your processing on userDetail 
    return UserDAL.TransferUserData(userDetail); 
} 

W DAL

public static UserDetail TransferUserData(UserDetail userDetail) 
{ 

    //do your processing of db 
    return userDetail; 
}