PDA

View Full Version : viewstate:سوالات و مشکلات فراوان در باره این موضوع(لطفا نظر بدید)



blackcats
سه شنبه 25 خرداد 1389, 13:26 عصر
با سلام خدمت دوستان عزیز
مشکلی که من چند روزی هست درگیرم و هنوز راه حل مناسبی براش پیدا نکردم در مورد viewstate میباشد.
سوال هایی برام مطرح شد که جواب منطقی پیدا نکردم از همه دوستان ممنون میشم اگر به سوال های من پاسخ بدن.
امیدوارم برای ما بقی دوستان هم مفید باشد.

1)چطور میشود در صفحه ای که طراحی کردم حجم viewstate را ببینم واگر بشه حجم viewstate هر کنترل رو ببینم که خیلی عالی میشه.

2)آیا میشود حجم viewstate کل صفحه رو محدود کرد

3)چرا بعضی از کنتر ها مانند textbox،dropdownlist زمانیکه viewstate آنها disable باز هم در postback اطلاعات رو نگه میدارن.

4)چرا وقتی در gridview زمانیکه viewstate اونرو میکنمdisable و page رو 2 میکنم(انتخاب صفحه دوم) زمانیکه postback میخوره reset نمیشه و به صفحه اول بر نمیگرده

5)viewstateچقدر در سرعت load صفحه تاثیر دارد

6)بهتره برای چه کنتر هایی viewstate رو disable کنیم.

7)اگر از این دستور استفاده کنم و <%@ Page Language="C#" EnableViewState="false" %> و کل ViewState رو disable کنم چه کنتر هایی به مشکل بر میخورن و در حجم اطلاعات چه تاثیری داره

و هزاران سوال دیگر در مورد viewstate!!!!!!!!!

من خیلی search کردم فهمیدم اطلاعات در یک
<input type="hidden" name="__VIEWSTATE"
value="CEbzzzEnmmz+Bc8IDFlnpgCLJ/HB00...>
ذخیره میشه اما نمیشه حجم اون رو دید.

hamedsabzian
سه شنبه 25 خرداد 1389, 13:49 عصر
بسیاری از سوالات شما در ذهن بنده هم هست!
برای دانستن حجم ViewState مقدار __VIEWSTATE رو در یک فایل Text ذخیره کنید و ببینید حجمش چقدره!

شخصا ViewState رو فشرده می کنم. حجمش حدود 60 تا 70 درصد کاهش پیدا می کنه!

blackcats
سه شنبه 25 خرداد 1389, 14:14 عصر
از دوست عزیزم که لطف کرد و جواب داد ممنونم منظورم از gridview این هست که زمانیکه paging اون رو فعال میکنم و صفحه اون رو تغییر میدم مثلا به 2 (صفحه دوم gridview) قانونا باید در postback بعدی gridview اطلاعات صفحه اول رو نمایش بده اما اینجوری نیستو همون صفحه دوم رو نمایش میدهد.

blackcats
سه شنبه 25 خرداد 1389, 14:42 عصر
آقا من این کد رو نوشتم توی VB ونسبت دادم به یه bUTTON:

Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim state As String
If Debugger.IsAttached Then
Using stream As New IO.MemoryStream()
Dim formatter As New LosFormatter()
formatter.Serialize(stream, state)
Dim size As Integer = stream.Capacity / 1024
Me.TextBox1.Text = size
If size > 32 Then
Throw New Exception("لطفا به وضعيت ويوو استيت اين صفحه رسيدگي نمائيد")
End If
End Using
End If
MyBase.SavePageStateToPersistenceMedium(state)
End Sub

اما کار نکرد صفر نشون میده توی TEXTBOX

راستی چرا زمانیکه readonly، textbox رو فعال میکنی در postback ها viewstate درست کار میکنه(چه ربطی داره به readonly اما توی این قسمت درست کار میکنه)

blackcats
سه شنبه 25 خرداد 1389, 15:11 عصر
طریقه فشرده کردن viewstate چگونه است.

hamedsabzian
سه شنبه 25 خرداد 1389, 15:32 عصر
طریقه ی فشرده سازی ViewState:
این کلاس برای فشرده سازی و بازیابی داده با الگوریتم GZip:
using System;
using System.Data;
using System.Configuration;
using System.IO;
using System.IO.Compression;

public static class CompressViewState
{
public static byte[] Compress(byte[] data)
{
MemoryStream output = new MemoryStream();
GZipStream gzip = new GZipStream(output, CompressionMode.Compress, true);
gzip.Write(data, 0, data.Length); gzip.Close();
return output.ToArray();
}
public static byte[] Decompress(byte[] data)
{
MemoryStream input = new MemoryStream();
input.Write(data, 0, data.Length); input.Position = 0;
GZipStream gzip = new GZipStream(input, CompressionMode.Decompress, true);
MemoryStream output = new MemoryStream();
byte[] buff = new byte[64]; int read = -1;
read = gzip.Read(buff, 0, buff.Length);
while (read > 0)
{
output.Write(buff, 0, read);
read = gzip.Read(buff, 0, buff.Length);
}
gzip.Close(); return output.ToArray();
}
}
کلاس زیر به منظور override دو متد SavePageStateToPersistenceMedium و LoadPageStateFromPersistenceMedium برای فشرده سازی و بازیابی ViewState:
using System;
using System.Collections;
using System.Configuration;
using System.Data;
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 System.Web.UI
{
public class BasePage : System.Web.UI.Page
{
private ObjectStateFormatter _formatter = new ObjectStateFormatter();
protected override void SavePageStateToPersistenceMedium(object viewState)
{
System.IO.MemoryStream ms = new System.IO.MemoryStream();
_formatter.Serialize(ms, viewState);
byte[] viewStateArray = ms.ToArray();
ClientScript.RegisterHiddenField("__COMPRESSEDVIEWSTATE", Convert.ToBase64String(CompressViewState.Compress( viewStateArray)));
}
protected override object LoadPageStateFromPersistenceMedium()
{
string vsString = Request.Form["__COMPRESSEDVIEWSTATE"];
byte[] bytes = Convert.FromBase64String(vsString);
bytes = CompressViewState.Decompress(bytes);
return _formatter.Deserialize(Convert.ToBase64String(byte s));
}
}
}
دو کلاس بالا در App_Code قرار گیرند.
دقت شود: هر صفحه ای که می خواهید ViewState آن فشرده شود، باید از این کلاس مشتق شود.
مثال:
public partial class Default : System.Web.UI.BasePage
{
protected void Page_Load(object sender, EventArgs e)
{...

منبع:
http://aspdotnetcodebook.blogspot.com/2008/09/how-to-compress-viewstate-in-aspnet-20.html

blackcats
سه شنبه 25 خرداد 1389, 16:45 عصر
خیلی عالی بود.
فقط اگر میتونستی در قالب یک مثال ساده برای بیاری طریقه اضافه کردن فایلها و خوندن اونها توی صفحه ای که میخوام compress بشه خیلی عالی بود(اگر vb.net باشه توپ توپ میشه).
بازم ممنون.

blackcats
چهارشنبه 26 خرداد 1389, 09:41 صبح
سلام
کسی در مورد compress در viewstate پروژه آماده ای داره
Please Help

hamedsabzian
چهارشنبه 26 خرداد 1389, 11:47 صبح
نمونه برنامه، فشرده سازی ViewState در C#:

daffy_duck376
چهارشنبه 26 خرداد 1389, 12:27 عصر
ولی یه موضوع موند چرا وقتی desible میشه کنترل هت مقادیرشون رو نگه میدارن؟

m110_110
چهارشنبه 26 خرداد 1389, 13:37 عصر
سلام
یه مشکلی که با فشرده سازی viewstate من قبلا پیدا کردم و باعث شد از ان صرفه نظر کنم این بود که در gridview هام مشکل پیدا کردند و باتن های روی اون درست کار نمی کردند
راستش هر کاری کردم درست نشد
حالا اول باید این مشکل رو دقیق بررسی کرد و بعد به استفاده از اون پرداخت

hamedsabzian
چهارشنبه 26 خرداد 1389, 17:20 عصر
سلام
یه مشکلی که با فشرده سازی viewstate من قبلا پیدا کردم و باعث شد از ان صرفه نظر کنم این بود که در gridview هام مشکل پیدا کردند و باتن های روی اون درست کار نمی کردند
راستش هر کاری کردم درست نشد
حالا اول باید این مشکل رو دقیق بررسی کرد و بعد به استفاده از اون پرداخت

بنده از کدی که گذاشتم توی برنامه هام استفاده می کنم. خدا رو شکر تا حالا به مشکلی برنخوردم، البته بجز در موارد خیلی خاص که توی همین انجمن مطرح کردم ولی به جواب نرسیدم.
در کل می توینید امتحان کنید و مشکل رو بگید!:چشمک:

aras12000
یک شنبه 28 شهریور 1389, 16:52 عصر
سوالات اولی که مطرح شده خیلی جالب و جامع هستند.می شود خواهش کنم کسانیکه می توانند توضیح دهند؟

blackcats
دوشنبه 29 شهریور 1389, 09:53 صبح
متاسفانه دوستان و مدیران در مورد این پست که خودم فکر میکنم میتونه سوال خیلی از دوستان باشه کم لطفی کردن.

unishomal
شنبه 18 دی 1389, 18:51 عصر
متاسفانه دوستان و مدیران در مورد این پست که خودم فکر میکنم میتونه سوال خیلی از دوستان باشه کم لطفی کردن.

جدا سوالای خوبی مطرح شد،لطفا دوستان اگر اطلاعاتی دارن دریغ نکنند!