.NET AJAX ve ViewState ile tutarsız davranış

oy
2

Benim tarayıcısında Yenile düğmesine basarak geçici olarak bir UpdatePanel içindeki denetimleri için ViewState berbat edeceğini buluyorum.

Benim durum İşte: Ben ViewState değerleri saklayan bir özel WebControl yaptı. Ben bir UpdatePanel içinde bu kontrolü uygulandı. Benim tarayıcısında yenile düğmesine basın girdiğinde geçici ViewState değerleri silecek. Ancak, ertesi postback, ben vurmadan önce ViewState vardı değerler yenilemek sihirli yeniden görünür.

Benim WebControl kadar bu davranış vidalar. Ben çarptı sonra ViewState boş ve ıspostback false olarak ayarlanır beri yenileme kontrol, başlangıç ​​durumuna döndürülür. Ancak, benim WebControl içinde geri gönderme kontrollerin birini tıkladığında, WebControl ben vurmadan önce ViewState içinde bulunduğumuz aynı değerlerle yeniden yüklenecek refresh.

Ben AJAX kullanarak olduğumda Garip bu yalnızca olur. Benim kontrolü UpdatePanel dışında olduğunda, Firefox, Firefox önceki (Tekrar Gönder) gerçekleştirildi (örneğin, bir arama veya sipariş onayı gibi) herhangi bir işlem tekrarlanacak bilgileri göndermesi gerekir bu sayfayı görüntülemek için Bana bunun standart mesaj verir (İptal) . En az davranışının tutarlı olduğu için bu, gayet iyi. Ancak, ben kesinlikle bu proje için AJAX kullanmalıdır.

Ben yenile davranışının tutarlı olmak için - Yani bu benim yapmak istiyorum şeydir. Hiç ViewState etkilemedi yenile isabet eğer iyi olurdu. o ViewState ortadan kaldırmaya varsa Ama, bu sürece ViewState sildi kaldığı sürece, sorun yok. değerleri kaybolan ve Reappearing ile bu şeyler hiçbiri.

Ah evet, ve benim kod örneği verilmiştir:

using System;
using System.Data;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;

namespace TestControls
{
    public class TestControl : WebControl
    {
        int _clickCount;
        bool _mustUpdate;

        protected override void LoadViewState(object savedState)
        {
            base.LoadViewState(savedState);

            _clickCount = ((int)ViewState[clickCount]);
            _mustUpdate = ((bool)ViewState[mustUpdate]);
        }

        protected override void OnLoad(EventArgs e)
        {
            base.OnLoad(e);

            Controls.Clear();
            ControlCreator();
        }

        private void ControlCreator()
        {
            Label tempLabel = new Label();
            LiteralControl tempLiteral = new LiteralControl(<br/><br/>);
            LinkButton tempLink = new LinkButton();

            tempLink.ID = testLink;
            tempLink.Text = Click me!;
            tempLink.Click += new EventHandler(tempLink_Click);

            tempLabel.ID = testLabel;
            tempLabel.Text = _clickCount.ToString();

            Controls.Add(tempLabel);
            Controls.Add(tempLiteral);
            Controls.Add(tempLink);
        }

        void tempLink_Click(object sender, EventArgs e)
        {
            _clickCount++;
            _mustUpdate = true;
        }

        protected override void OnPreRender(EventArgs e)
        {
            base.OnPreRender(e);

            if (_mustUpdate)
            {
                Controls.Clear();
                ControlCreator();

                _mustUpdate = false;
            }
        }

        protected override object SaveViewState()
        {
            ViewState[clickCount] = _clickCount;
            ViewState[mustUpdate] = _mustUpdate;

            return base.SaveViewState();
        }
    }
}
Oluştur 09/12/2008 saat 21:50
kaynak kullanıcı
Diğer dillerde...                            


3 cevaplar

oy
1

Sadece sorunuzu tekrar okumak ve bir şey kaçırmış fark ...

Sen vuruyorsun tarayıcılar düğmesini yenilemek!

Bu bir sorun mu? EVET!

Eğer tarayıcınızda yenile butonuna basarak ne olur? Mevcut sayfayı yeniler. Bir geri gönderme olsaydı, o yazılan veriyi yeniden gönderecektir.

AJAX geri kadarıyla sayfa ilgilidir ancak tarayıcı yenileme düğmesine basarak eski ViewState yeniden gönderebilirsiniz gibi ViewState güncelleyebilir.

zengin olan Google'a can konuyla ilgili tartışma var olmasıdır.

Bir çok basit bir fikir belki yerine belki oturum durumu bilgileri saklamaktır. Bu da aynı zamanda tabii çok kendi sorunu olabilir. Ama bu hemen hedefe olabilir.

Bir geri gönderme (yeniden yazı önlemek için) tarihini silerek için bir ipucu tekrar tekrar aynı sayfaya yönlendirme sağlamaktır.

Cevap 12/12/2008 saat 14:19
kaynak kullanıcı

oy
1

Takip etmeyi dene...

    protected override void LoadViewState(object savedState)
    {
        if (savedState != null)
        {
            object[] myState = (object[])savedState;

            if (myState[0] != null) base.LoadViewState(myState[0]);
            if (myState[1] != null) _clickCount = ((int)myState[1]);
            if (myState[2] != null) _mustUpdate = ((bool)myState[2]);
        }
    }

    protected override object SaveViewState()
    {
        object[] allStates = new object[3];

        allStates[0] = base.SaveViewState();
        allStates[1] = _clickCount;
        allStates[2] = _mustUpdate;

        return allStates;
    }

Temelde yukarıdaki kod türetilen Control.LoadViewState yöntem ve Control.SaveViewState Yöntem MSDN'den.

Cevap 10/12/2008 saat 00:27
kaynak kullanıcı

oy
0

Kişisel ViewState kaydediliyor değildir. SaveViewState geçersiz kılma değil ViewState torbaya şeyler koymak için, NESNELERI tasarrufu içindir. ViewState torba kirli şeyler mnarking noktasının ötesine zaten olduğunu ve kalıcı olmayacaktır yapmak değiştirir. Sen / yük ViewState bilgilerini görüntülemek için bir nesne dizisi oluşturmak gerekiyor.

BlackMael gösterir yap.

Cevap 10/12/2008 saat 00:32
kaynak kullanıcı

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more