2013-02-19 10 views
25

Próbuję poprawić wydajność mojego portalu internetowego. Używam sesji do przechowywania informacji o stanie.Jak przekazywać wartości na stronach w ASP.net bez korzystania z sesji

Ale słyszałem, że użycie sesji zmniejszy prędkość aplikacji. Czy istnieje inny sposób przekazywania wartości na stronie w asp.net.

+0

Czy próbowałeś pamięci podręcznej? – ssilas777

+0

Nie jest źle używać 'sesji', ale są pewne czynniki w korzystaniu z sesji. Liczba użytkowników. Twoja przepustowość. Sever pojemność. Jeśli masz dobre z wyżej wymienionych, możesz użyć 'sesji'. –

+0

@ ssilas777 Zwykle 'cache' jest takie samo dla wszystkich użytkowników. Więc w jego przypadku nie może używać pamięci podręcznej. –

Odpowiedz

51

można przekazać wartości z jednej strony na drugą przez poniższych ..

Response.Redirect 
Cookies 
Application Variables 
HttpContext 

response.redirect

SET:

Response.Redirect("Defaultaspx?Name=Pandian"); 

GET:

string Name = Request.QueryString["Name"]; 

Cookies

SET:

HttpCookie cookName = new HttpCookie("Name"); 
cookName.Value = "Pandian"; 

GET:

string name = Request.Cookies["Name"].Value; 

Zmienne aplikacji

SET:

Application["Name"] = "pandian"; 

GET:

string Name = Application["Name"].ToString(); 

zobacz pełną treść tutaj: Pass values from one to another

+6

'-1' dla plików cookie i aplikacji. Zwłaszcza aplikacja nie działa, jeśli używasz webgarden lub webfarm !. A zmienne aplikacji to prosty słownik <>, który istnieje tylko w celu zachowania kompatybilności ze starą wersją asp i nie może być używany. Również pliki cookie nie są przeznaczone do przesyłania danych z jednej strony na drugą. Bardzo zły projekt, nie dobra praktyka. – Aristos

+0

@Aristos, czy -1 ma zastosowanie, gdy dane są (mają być) przechowywane jako plik cookie? Jeśli każda strona musi pobrać dane z pliku cookie i zapisać zmodyfikowane wartości do pliku cookie, czy istnieje jakaś wartość w przechowywaniu danych w innym miejscu ** również **? – user34660

+1

@ user34660 Nie rozumiem cię ... – Aristos

22

Istnieje wiele sposobów, aby to osiągnąć. Mogę ci krótko wyjaśnić 4 rodzaje, których używamy w naszym codziennym cyklu życia.

Proszę przejść przez poniższe punkty.

1 ciąg zapytania.

FirstForm.aspx.cs

Response.Redirect("SecondForm.aspx?Parameter=" + TextBox1.Text); 

SecondForm.aspx.cs

TextBox1.Text = Request.QueryString["Parameter"].ToString(); 

Jest to najbardziej niezawodny sposób, kiedy przechodzą całkowitą rodzaju wartości lub inne krótkie parametry. Większy postęp w tej metodzie, jeśli używasz znaków specjalnych w wartości podczas przekazywania ciągu zapytania, musisz zakodować wartość przed przekazaniem jej do następnej strony. Więc nasz kod fragment będzie coś takiego:

FirstForm.aspx.cs

Response.Redirect("SecondForm.aspx?Parameter=" + Server.UrlEncode(TextBox1.Text)); 

SecondForm.aspx.cs

TextBox1.Text = Server.UrlDecode(Request.QueryString["Parameter"].ToString()); 

URL Kodowanie

  1. Server.URLEncode
  2. HttpServerUtility.UrlDecode

2. Wartość przechodzącej przez obiekt kontekstowego

Przekazywanie wartości przez obiekt kontekście jest kolejną powszechnie stosowaną.

FirstForm.aspx.cs

TextBox1.Text = this.Context.Items["Parameter"].ToString(); 

SecondForm.aspx.cs

pamiętać, że jesteśmy przechodząc na inną stronę używając Server.Transfer zamiast response.redirect. Niektórzy z nas używają również obiektu Session do przekazywania wartości. W tej metodzie wartość jest przechowywana w obiekcie Session, a następnie jest pobierana z obiektu Session na Drugiej stronie.

3.Przesyłanie formularza na inną stronę zamiast na PostBack

Trzecia metoda przekazywania wartości przez umieszczenie strony w innym formularzu. Oto przykład, że:

FirstForm.aspx.cs

private void Page_Load(object sender, System.EventArgs e) 
{ 
    buttonSubmit.Attributes.Add("onclick", "return PostPage();"); 
} 

I tworzymy funkcji javascript, aby opublikować formularz.

SecondForm.aspx.cs

function PostPage() 
{ 
    document.Form1.action = "SecondForm.aspx"; 
    document.Form1.method = "POST"; 
    document.Form1.submit(); 
} 
TextBox1.Text = Request.Form["TextBox1"].ToString(); 

Tu Piszesz formę na inną stronę, a nie siebie. Możesz uzyskać nieprawidłowy stan witryny lub błąd na drugiej stronie przy użyciu tej metody. Aby obsłużyć ten błąd jest umieszczenie EnableViewStateMac=false

4. Inną metodą jest poprzez dodanie właściwość PostBackURL kontroli krzyżowej widoku post Powrót

W ASP.NET 2.0, Microsoft rozwiązał ten problem poprzez dodanie własności PostBackURL z kontrola dla odesłania strony krzyżowej. Wdrożenie to kwestia ustawienia jednej właściwości kontroli i gotowe.

FirstForm.aspx.cs

<asp:Button id=buttonPassValue style=”Z-INDEX: 102″ runat=”server” Text=”Button”   PostBackUrl=”~/SecondForm.aspx”></asp:Button> 

SecondForm.aspx.cs

TextBox1.Text = Request.Form["TextBox1"].ToString(); 

W powyższym przykładzie mamy do przypisywania właściwości PostBackUrl przycisku możemy określić stronę który będzie publikował zamiast siebie. Na następnej stronie mamy dostęp do wszystkich elementów sterujących na poprzedniej stronie za pomocą obiektu Request.

Możesz również użyć klasy Poprzednia strona, aby uzyskać dostęp do elementów sterujących na poprzedniej stronie, zamiast korzystać z klasycznego obiektu żądania.

SecondForm.aspx

TextBox textBoxTemp = (TextBox) PreviousPage.FindControl(“TextBox1″); 
TextBox1.Text = textBoxTemp.Text; 

Jak można zauważyć, jest to również prosta i czysta realizacja przechodzącej wartość pomiędzy stronami.

referencyjny: MICROSOFT MSDN WEBSITE

SZCZĘŚLIWY KODOWANIE!

+1

jakikolwiek powód głosowania w dół? –

+0

Nie wiem jak napisać twoje imię, ale dzięki za informację. Mam metodę w mojej Master.Page, która pobiera/ustawia obiekt użytkownika do zmiennej Session. Po zalogowaniu na stronie logowania, która dziedziczy Master.Page, mogą wysłać wiadomość e-mail za pomocą strony Kontakt, która również dziedziczy z Master.Page. Jednak na zdarzeniu Page_Load strony Kontaktu obiekt użytkownika ma wartość NULL. Nie wiem dlaczego. – jp2code

1

można przypisać go do pola ukrytego i pobrać go za pomocą

var value= Request.Form["value"] 
3

Jeśli to tylko do przekazywania wartości pomiędzy stronami i wymagają jedynie go do jednego wniosku. Użyj Context.

Kontekst

Obiekt Context przechowuje dane dla pojedynczego użytkownika, dla pojedynczego wniosek, i to jest zachowywane tylko na czas trwania wniosku.Kontener Kontekstowy może pomieścić duże ilości danych, ale zwykle jest to używany do przechowywania małych fragmentów danych, ponieważ często jest zaimplementowany dla każdego żądania za pośrednictwem programu obsługi w pliku global.asax. Kontener (dostępny z obiektu Strony lub przy użyciu System.Web.HttpContext.Current) zapewnia wartości, które wymagają do przekazywania między różnymi modułami Http i HttpHandlers. Może on również być używany do przechowywania informacji istotnych dla całego żądania . Na przykład portal IBuySpy umieszcza w tym kontenerze pewną informację o konfiguracji podczas obsługi zdarzeń Application_BeginRequest w pliku global.asax. Zauważ, że dotyczy to tylko bieżącego żądania; jeśli potrzebujesz czegoś, co będzie jeszcze około dla następnego żądania, rozważ użycie ViewState. Ustawianie i uzyskiwanie danych z kolekcji Context używa składni identycznej do tej, jaką już widziałeś z innymi obiektami kolekcji, takimi jak Application, Session i Cache. Dwa proste przykłady pokazane są tutaj:

// Add item to 
Context Context.Items["myKey"] = myValue; 

// Read an item from the 
Context Response.Write(Context["myKey"]); 

http://msdn.microsoft.com/en-us/magazine/cc300437.aspx#S6

Stosując powyższe. Jeśli następnie zrobisz Server.Transfer dane zapisane w kontekście będą teraz dostępne na następnej stronie. Nie musisz zajmować się usuwaniem/sprzątaniem tych danych, ponieważ są one ograniczone tylko do bieżącego żądania.

+0

Przepraszam, że powinienem być bardziej konkretny. Odpowiedź została zaktualizowana. –

+0

Tak, ok, po uruchomieniu Server. Transfer to działa. – Aristos

1

Można użyć string zapytanie przekazać wartość z jednej strony na drugą ..

1.przekazać wartość używając kwerendy

Response.Redirect("Default3.aspx?value=" + txt.Text + "& number="+n); 

2.Retrive wartości na stronie u chcą przy użyciu jednej z następujących metod ..

Method1:

string v = Request.QueryString["value"]; 
    string n=Request.QueryString["number"]; 

Method2 :

 NameValueCollection v = Request.QueryString; 
    if (v.HasKeys()) 
    { 
     string k = v.GetKey(0); 
     string n = v.Get(0); 
     if (k == "value") 
     { 
      lbltext.Text = n.ToString(); 
     } 
     if (k == "value1") 
     { 
      lbltext.Text = "error occured"; 
     } 
    } 

UWAGA: Metoda 2 jest najszybszą metodą.

Powiązane problemy