Soru ASP.NET ile Yönlendirme Sonrası-Alma


Nasıl uygulayabilirim Sonrası Yönlendirme-Al ASP.NET ile desen?

Bir düğme tıklatması bazı işlemleri gerçekleştirir:

<asp:Button id="bbLaunch" OnCommand="bbLaunch_Click" />

Kullanıcı düğmeyi tıklar, uzay aracı başlatılır, web sayfası yeniden görüntülenir. Kullanıcı F5'e basarsa, uyarıyı alırlar:

enter image description here

Sorunun çözümü, Sonrası Yönlendirme-Al Desen.

Yöntemi nedir PRG ASP.NET'te uygulanabilir mi?


Soru, şu sorunlara odaklanır:

  • nasıl yapabilirim <asp:Button> gerçekleştirmek POST Özgün formu olmayan bir yere mi?
  • ne olur Durumu görüntüle görüntüleme durumunu okumayan bir forma gönderirken?
  • ne olur Durumu görüntüle "gerçek" aspx web formuna yönlendirdiğinizde?
  • olduğu Durumu görüntüle temelde uyumsuz ASP.net Sonrası Yönlendirme-al?
  • ASP.net ile temelde uyumsuz Sonrası Yönlendirme - Get?
  • Nasıl (yani hangi kodu) "gerçek" aspx web formuna yönlendiriyorsunuz?
  • Nasıl (yani hangi URL’yi) "gerçek" aspx web formuna yönlendiriyorsunuz? Bir ilişki sorunu söz Response.Redirect(Request.RawUrl);
  • ne zaman (yani hangi olay işleyicide) "gerçek" aspx web formuna yönlendiriyorsunuz?
  • ilgili sorular sorunlara yol açıyor Nasıl form verisi gönderiyorsunuz. HTML'nin ima ettiği var formlar kullanılamaz - ve tüm form verileri sorgu dizesine eklenmelidir. Bu doğru mu? Öyleyse neden? Değilse neden olmasın? kutu tarayıcı bir sorgu dizesine form verilerini koydu mu?
  • ilgili bir sorudan bahseder Server.Transfer. kullanma Server.Transfer tamamen yanlıştır ve hiçbir şekilde Yönlendirme Sonrası-Alma problemini çözmez (çünkü yönlendir). Doğru?
  • hangi kod değişiminin olması gerekiyor aspx veya aspx.cs PRG desteklemek için dosya? Muhtemelen, en azından, kodun post dışında bir yerde MyPage.aspx.

Diğer bir deyişle: ASP.NET'te Yönlendirme-Sonrası Nasıl Yaparsınız?

Not: ASP.net (ASP.NET MVC değil)

Ayrıca bakınız


39
2018-03-21 17:14


Menşei




Cevaplar:


Tipik olarak bunu yapmak için hangi kaydı / işlemi işaret etmek için querystring kullanan bir aspx web formu yaparak yaparsınız.

Bazı müşteri bilgilerini güncellemenize izin veren bir sayfanız olduğunu varsayalım:

http://www.mysite.com/customer.aspx

Formu, querystring'de bir kimlik kullanarak yüklersiniz:

http://www.mysite.com/customer.aspx?CustomerId=42

Codebehind'de şöyle bir şey olurdu:

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        int customerId = 0;
        if (!string.IsNullOrEmpty(Request.QueryString["CustomerId"]))
        {
            int.TryParse(Request.QueryString["CustomerId"], out customerId );
        }
        if (customerId == 0) 
        {
            //handle case when no valid customer id was passed in the qs here
        }
        else 
        {
            //load customer details, bind controls etc
            //make sure to handle the case when no customer was found using the id in the qs
        }
    }
}

Ardından, sayfanızda bir yerde değişiklikleri kaydeden bir düğme olacaktır. Bu düğmede, aşağıdaki kodda bir OnClick işleyicisi bulunur:

protected void SaveClicked(object sender, EventArgs e)
{
    //save changes to database here

    //Redirect if all went well
    Response.Redirect("http://www.mysite.com/customer.aspx?CustomerId=" 
        + idOfSavedCustomer.ToString());
}

Temelde öyle olmalıydı. Yönlendirme, tarayıcının Yönlendirme'deki (...) URL için yeni bir GET isteği yayınlamasına neden olur. Sayfayı yükleyecek, if (!IsPostBack) sayfayı önceki gönderide kaydettiğiniz yeni değerlerle çalıştırır ve başlatır.

Bu süreç için, tarayıcı ve sunucu arasındaki trafik şöyle bir şey olurdu:

Browser: GET http://www.mysite.com/customer.aspx?CustomerId=42
Server: 200 (send back some html)

Browser: POST http://www.mysite.com/customer.aspx?CustomerId=42 (post data sent in request)
Server: 302 (point to http://www.mysite.com/customer.aspx?CustomerId=42)

Browser: GET http://www.mysite.com/customer.aspx?CustomerId=42
Server: 200 (send html)

Orta adımda, sunucu temelde şöyle diyor:

"Bu gönderi isteğini bana gönderdim, işim bitti. Şimdi bu sayfaya buradan bakın ..."

Aslında URL'nin aynı sayfaya yönlendirmesi önemli değildir.


Mermi puanlarınıza cevaben bazı müzakereler soru listesi:

  • olmayan bir yere nasıl POST yapabiliriz Orijinal form?

Bunu ayarlayarak bunu yapabilirsiniz action formdaki özniteliği veya PostBackUrl Düğme üzerinde.

  • olmayan bir forma yüklediğinizde ViewState ne olur? görünüm durumunu oku

Bağlı. Formu yalnızca farklı bir sayfaya gönderirseniz, yayının geldiği "yeni" sayfayı anlatmak için <% @ PreviousPageType ... /> yönergesini kullanabilirsiniz. Bu, yeni sayfada yayınlanan verilerle çalışmayı basitleştirecektir. Görmek detaylar için bu link.

  • "gerçek" aspx'e yönlendirdiğinizde ViewState ne olur? internet formu?

Görüntüleme durumu, posta isteğinde gönderilir. Yönlendirme yaparken, tarayıcı yeni bir sayfa yükleyecek ve kendi viestate'ı oluşturacaktır.

  • ViewState temel olarak ASP.net ile uyumlu değil Sonrası Yönlendirme-al?

Ona nasıl baktığına bağlı. Yönlendirme sonrasında yeni sayfa, sayfanın önceki görüntüsüne erişemez.

  • ASP.net temelde Post-Yönlendirme ile uyumlu değil - Get?

Hayır. Yukarıdaki örneğe bakınız.

  • "gerçek" aspx web formuna nasıl (yani hangi kodu) yönlendiriyorsunuz?

Response.Redirect (URL). Bu, tarayıcıya yeni bir istek isteğini bildiren bir yanıt gönderecektir.

  • ne zaman (yani hangi olay işleyicide) "gerçek" aspx'e yönlendiriyorsunuz internet formu?

Gönderme isteğini işlemek için gerekli tüm işleri gerçekleştirdiğinizde.

  • İlgili sorular form verilerini nasıl yazdığınıza ilişkin sorunları gündeme getirir. Orada HTML formlarının kullanılamadığı ve tüm verilerin oluşturulmasının imkansızlığıdır. sorgu dizesine eklenmelidir. Bu doğru mu? Öyleyse neden? Değilse neden olmasın? Bir tarayıcı, bir sorgu dizesine form verilerini verebilir mi?

Bir gönderi isteğinin yönlendirilmesi iyi desteklenmemektedir ve muhtemelen bundan kaçınılmalıdır. Http yanıtı 307'yi kullanarak (bazı tarayıcılarla) yapılabilir. Bunu yaparken, sunucu tarayıcıya etkili bir şekilde "İleti göndermenizi istemiyorum, lütfen bunun yerine bu sayfaya gönderin".

  • ilgili bir soru Server.Transfer bahseder. Server.Transfer'ı kullanmak Tamamen yanlıştır ve Post-Yönlendirme-Get problemini hiçbir şekilde çözmez (Çünkü Yönlendirme yoktur). Doğru?

Server.Transfer (...), sunucu tarafında yer alan bir şeydir. Tarayıcı bunun farkında değil. Temelde bir sayfa, başka bir sayfanın işlenmesini sağlamak için Server.Transfer'ı kullanabilir ve bu sayfa tarayıcıya bir yanıt göndermekten sorumlu olacaktır. Ancak tarayıcı, yanıt veren orijinal sayfa olduğunu düşünecektir.

  • aspx veya aspx.cs dosyasında hangi kod değişikliğinin olması gerekiyor PRG? Muhtemelen, en azından, kod yazılacak şekilde değiştirilmelidir MyPage.aspx dışında bir yerde.

Hayır, normal bir geri gönderme kullanılabilir. Hile, yayınlanan verileri işledikten sonra bir Repsonse.Redirect yapan sayfada bir (veya birkaç) özel olay işleyicisine sahip olmaktır.


34
2018-06-12 08:33





S) Orijinal şekli olmayan bir yere nasıl POST yapabiliriz?

A) PRG ile farklı bir sayfaya POST yapmazsınız, aynı sayfaya geri gönderirsiniz (bağlandığınız wikipedia sayfasındaki şemaya bakın.) Ancak bu sayfadaki yanıt 30X cevabı OLMALIDIR (tipik olarak 302). .)

Q) View durumunu okuyamayan bir forma yüklediğinizde ViewState ne olur?

A) POST görüntülendiğinde görünüm durumu var, ancak GET üzerinde yaptığınız yeni sayfa için orada görünüm durumu olmayacak.

Q) "gerçek" aspx web formuna yönlendirdiğinizde ViewState ne olur?

A) Yukarıya, daha fazla görüntüleme durumu sayfaya yönlendiriliyor.

Q) ViewState temel olarak ASP.net ile uyumsuz mu?

A) ViewState, ASP.NET ile uyumlu değil. Yönlendirdiğiniz sayfayı oluşturmak için P / R / G için çoğunlukla (çoğunlukla) işe yaramaz.

Q) temel olarak Post-Redirect - Get ile uyumlu değil mi?

A) Hayır - ama bir sayfaya fazla güvenme ve tüm durumunuzu yukarıdaki gibi görülemeyecek şekilde koruyamazsınız. Bu, ASP.MVC'nin P / R / G'ye göre daha iyi olduğunu söyledi.

S) "gerçek" aspx web formuna nasıl (yani hangi kodu) yönlendiriyorsunuz?

A) vintage_page_you_are_posting_from.aspx'in bbLaunch_Click yönteminde Response.Redirect ("new_page_you_are_redirecting_to.aspx")

S) "gerçek" aspx web formuna nasıl (yani hangi URL’yi) yönlendiriyorsunuz? Bir ilişki sorusu Response.Redirect (Request.RawUrl);

A) Yukarıya bakınız

Q) ne zaman (yani hangi olay işleyicisinde) "gerçek" aspx web formuna yönlendiriliyorsunuz?

A) Düğmeyi işledikten sonra, verileri DB'ye (veya oturuma, vb.) Ve Yanıt akışına başka bir şey yazmadan önce kaydedin.

Q) İlgili sorular form verilerini nasıl yazdığınıza ilişkin sorunları gündeme getirir. HTML formlarının kullanılamayacağı bir anlam var - ve tüm form verileri sorgu dizesine eklenmelidir. Bu doğru mu?

A) Hayır - ASP.NET WebForms'daki tuşa basma, sayfaya geri dönecektir.

S) Öyleyse neden? Değilse neden olmasın?

A) Bundan daha basit, neden olmasın. İki sayfa görüntüleme: first_page.asp ve second_page.aspx. First_page.aspx'in üzerinde düğme var (kullanıcının doldurduğu metin kutuları gibi diğer ASP.NET web denetimleriyle birlikte.) Düğmeye bastığında, first_page.aspx için bir POST yapılır. Verileri işledikten sonra (büyük olasılıkla görüntülemenin içinde yer alması muhtemel olsa da), kullanıcıyı Response.redirect kullanarak second_page.aspx dosyasına yönlendirirsiniz. Second_page.aspx ne istediğinizi görüntüleyebilir. Kontroller ve girilenler de dahil olmak üzere, first_page.aspx üzerinde olana benzer UI görüntülemek istiyorsanız (ya da ihtiyacınız varsa), bunu oturumda, bir çerezde, querystring params olarak URL’de saklamak istiyorsanız second_page.aspx üzerindeki kontroller. (Ancak, second_page.aspx'te first_page.aspx'e benzer herhangi bir şey görüntülemeniz gerekmeyebilir - bu nedenle burada genel bir kural yoktur.)

S) Tarayıcı, bir sorgu dizesinde form verisi ekleyebilir mi?

A) Yöntemi POST yerine GET olarak ayarlarsanız. Bunu yapmak için WebForms'ı geçersiz kılabilirsiniz ve bu PRG için gerekli değildir.

Q) ilgili bir soru Server.Transfer bahseder. Server.Transfer'ı kullanmak tamamen yanlıştır ve hiçbir şekilde Yönlendirme Sonrası-Alma sorununu çözmez (çünkü Yönlendirme yoktur). Doğru?

A) Aslında

S) PRG'yi desteklemek için aspx veya aspx.cs dosyasında hangi kod değişikliği olması gerekiyor? Muhtemelen, en azından, MyPage.aspx dışında bir yere postalamak için kod değiştirilmelidir.

A) Kod yine de (yukarıda belirtildiği gibi) geri gönderilmelidir. Fakat sonra Mypage.aspx, düğme işleyicisindeki yeni bir sayfaya yeniden yönlendirmelidir.


7
2018-06-06 20:50





Post Redirect Get'in tam adımları şu şekildedir:

http://www.planethost.gr/PostRedirectGet.jpg

Verilerinizle doldurduğunuz formunuz vardır ve geçerli gönderiminizden (POST) sonra bunları veritabanınıza eklersiniz ve onlara bir onaylama kimliği verirsiniz, ardından kullanıcıyı bu doğrulama kimliğiyle birlikte kullanılan URL parametresi olarak sayfaya yönlendirirsiniz. (GET) olarak Yeniden yönlendirmeden sonra her F5 yenilemesi sadece veriyi okur ve tekrar eklemez.

Ekleme kodu, onayı gösteren koddan farklıdır, hatta bunları farklı sayfalar haline getirebilirsiniz - aynı sayfayı salt metin kutularıyla yapabilirsiniz.

Yönlendirme basittir Responce.Redirect asp.net işlevi

POST ve yeniden yönlendirme yaptıktan sonra, yalnızca önceki eylemle bağlantı kurduğunuzu düşünmek onay kodudır (viewtate değil).

Bu yöntemin eksi, aslında yenilemeyi tanımamasıdır, yalnızca yenilemenin aynı veriyi tekrar eklememesini sağlayan ekstra bir adımdır - ancak Veriler için ekstra kod gerektirir.

Alternatif, yenilemeyi tanımak ve yönlendirme yapmamaktır. Kayıt sonrası yenilemeyi tanıyarak, aynı verileri kullanıcıya tek bir mesajla eklemekten kaçınabilirsiniz. Bunun için internette bazı örnekler var ve başarıya sahip biriyim.

Bir örnek: http://www.codeproject.com/Tips/319955/How-to-prevent-Re-Post-action-caused-by-pressing-b


5
2018-06-07 00:38





Yönlendirme Sonrası-Alma Modeli Web Formlarında kullanılabilir. MVC NerdDinner uygulamasını Web Formlarına dönüştürerek bunun nasıl yapılabileceğini gösterdim, http://navigationnerddinner.codeplex.com/ . Navigasyon detaylarını tam olarak aynı tuttum, bu yüzden PRG modelinin birçok örneği var.

Ancak, F5 / Yenile sorununu önlemenin başka bir yolu var. Sayfanızı bir UpdatePanel'e (ASP.NET Ajax'ın bir parçası) kaydırırsanız, tüm geri gönderimler kısmi sayfa isteklerine dönüştürülür. Bu, F5'e basıldığında yalnızca orijinal GET isteğini yenileyeceği anlamına gelir (daha sonra herhangi bir POST olmadığından) ve bu yüzden uyarıyı alamazsınız. (Not, JavaScript devre dışı ise uyarı hala görünecektir).


5
2018-06-07 09:52



Bu harika bahşiş için teşekkürler! Uzun zamandır WebForms ile çalışıyorum, ancak şu anda PRG ile uğraşırken, bunun yerine bir UpdatePanel kullanmayı tamamen unuttum! Bu, sayfanın yenilenmesini çok kolay bir şekilde çözer! - Oliver


Sen çağırabilirsin Response.Redirect Başka bir yere gitmek için yöntem.


4
2018-03-21 17:18



Sahip olan sayfaya nasıl ulaşırım? Response.Redirect? - Ian Boyd


Buna giren birkaç şey var.

  1. Yı kur aksiyon formun ana sayfadaki özniteliği (diyelim) LaunchForm.aspx) "proxy" sayfasının URL'sine eşittir (ProxyLaunchForm.aspx).

    <form id = "form1" runat = "sunucu" action = "ProxyLaunchForm.aspx" method = "POST">

  2. (isteğe bağlı) İsim ile bir gizli giriş ekleyin yönlendirme bağlantısı söyleyen URL'yi formuna ve değerine ProxyLaunchForm.aspx lansman yapıldığında (PRG'nin R kısmı) bir kez yönlendirilir.

  3. Şu andan itibaren ProxyLaunchForm.aspx, uygulama içinde yer almalıdır Page_Load olay işleyici, çünkü bu form verisi formuna erişime sahiptir. Lansmanı buradan yürüt.

  4. Daha sonra (aynı zamanda Page_Load), yönlendirmeyi gerçekleştirin ( yönlendirme bağlantısı 2 numaralı telefondan veya sadece yönlendirme sayfası URL'sini kullanarak):

    Response.Redirect (Request.Params ["redirectUrl"] ?? Request.UrlReferrer.AbsoluteUri);

    Halen Görünüm Devleti meselesi var. Bununla başa çıkmanın en kolay yolu, görüşün nasıl devam ettiğini değiştirmek. Normalde, sayfadaki gizli bir giriş elemanına kaydedilir ve geri gönderme sırasında alınır (tabiki HTTP'nin vatansız niteliğinden dolayı yeniden yönlendirmeden sonra kaybolacağı anlamına gelir). Ancak, ASP.net'in kullandığı yöntemleri geçersiz kılabilir ve Oturum, toplantı, celse bunun yerine (bu şekilde PRG proxy eyleminden sonra bile mevcut olacaktır). En sonunda...

  5. İçinde LaunchForm.aspx.csalt sınıf bir alt sınıf olarak kullanın Sayfa Bu geçersiz kılar SavePageStateToPersistenceMedium ve LoadPageStateFromPersistenceMedium Gizli form alanından ziyade onları oturumdan saklama / alma yöntemleri. Aşağıya bakın (ve Bunun nasıl çalıştığına dair daha fazla bilgi.).

*

public class PersistViewStateToSession : Page
{
    protected override void SavePageStateToPersistenceMedium(object viewState)
    {
        // serialize the view state into a base-64 encoded string
        LosFormatter los = new LosFormatter();
        StringWriter writer = new StringWriter();
        los.Serialize(writer, viewState);
        // save the string to session
        Session["LaunchViewState"] = writer.ToString();
    }

    protected override object LoadPageStateFromPersistenceMedium()
    {
       if (!Session["LaunchViewState"] == null)
           return null;
       else
       {
          string sessionString = (string)Session["LaunchViewState"];
          // deserialize the string
          LosFormatter los = new LosFormatter();
          return los.Deserialize(viewStateString);
       }
    }
}

2
2018-06-12 17:06



Öğe 4 - değerlerini session çok farklı viewstate oturum kalıcı olmadığından (varsayılan olarak). 20 dakika sonra (varsayılan olarak) veya sunucu / sanal makinenin yeniden başlatıldığında veya geri dönüştürüldüğünde. Dolayısıyla, sayfaları gün sonra yeniden yükleyen mobil cihazlar için hiç veriye sahip olmayacaksınız. ViewState verileri kalıcı olarak - veya sayfa tarayıcıdan temizlenene kadar saklar. - GlennG