PDA

View Full Version : سوال: Reset نشدن مقدار عناصر



RoostaYeBekr
پنج شنبه 21 آذر 1387, 00:44 صبح
با سلام
:لبخندساده:
ببخشید دوستان من توی بحث ViewState ضعیف هستم. توی همین سایت هم Search کردم ، ولی جوابی برای سوال خودم پیدا نکردم.

مگه نمی گن که :
ViewState را باید در صفحاتی که تعاملی با کاربر ندارند False کنی.
در غیر اینصورت، عناصر نمیتونن مقدار خودشون رو حفظ کنند و در اثر PostBack مقادیرشون Reset میشه.

پس چرا من هر کاری می کنم ( در کد زیر ) ، و هر چقدر هم که روی دکمه Button1 کلیک می کنم ، در اثر رفرش صفحه باز هم مقدار TextBox1 نشان داده می شه؟



<%@ Page Language="C#" EnableViewState="false" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Untitled Page</title>
</head>
<body>
<form id="form1" runat="server" >
<div>
<center>
<asp:TextBox ID="TextBox1" runat="server" EnableViewState="false" >
</asp:TextBox>
<asp:Button ID="Button1" runat="server" Text="Button" />
</center>
</div>
</form>
</body>
</html>



protected void Page_Load(object sender, EventArgs e)
{

}
protected void Button1_Click(object sender, EventArgs e)
{

}

محمدامین شریفی
پنج شنبه 21 آذر 1387, 13:46 عصر
دوست من اگه viewstate صفحه را false میکنی دیگه نیازی نیست که اینگونه بنویسی


<asp:TextBox ID="TextBox1" runat="server" EnableViewState="false" >



چون همه کنترل ها از آن ارث میبرند..
دوست من cash و state دو چیز متفاوت میباشد.:چشمک:

RoostaYeBekr
پنج شنبه 21 آذر 1387, 15:51 عصر
با سلام
آخه می دونید یک بار آقای بهروز راد گفت که :


تغییراتی که کاربر در هنگام کار با فرم بر روی عناصر اعمال میکنه و باعث تغییرات خصوصیات پیش فرض اونها میشه، در هنگام PostBack در ViewState ذخیره میشن تا در زمان نمایش مجدد صفحه، این تغییرات Reset نشن.
به عنوان مثال، وارد کردن یک مقدار در یک TextBox و یا تغییر رنگ پس زمینه ی یک Button.

به خاطر همین هم من این سوال را در این تاپیک مطرح کردم. در حقیقت من آمده ام ViewState را False کردم ، ولی با PostBack صفحه ، نمی دانم چرا TextBox ام ، باز هم ، مقدار وارد شده در آن را نشان می دهد. ( البته برای تغییر رنگ Button ، چیزی که آقای بهروز راد گفت ، دارد درست انجام می شود . ولی این TextBox نه .)

محمدامین شریفی
پنج شنبه 21 آذر 1387, 16:21 عصر
آقای راد کاملا درست فرمودند.
در واقع هر تغییری که بشود در property ها بدهیم در کنترل ذخیره میشود.
سپس با یک کنترلی که عملیات submit انجام میدهد آن اطلاعات به سرور فرستاده میشود.
آن خواصیت مرورگر شماست.
اگر میخواهید مطمئن بشوید.در قسمت سرورتان یک request بدید و خصوصیت های جعبه متن را پس از submit کردن بخوانید.

محمدامین شریفی
پنج شنبه 21 آذر 1387, 17:03 عصر
<%@ Page Language="C#" EnableViewState="False" EnableViewStateMac="False" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<script runat="server">

protected void Button1_Click(object sender, EventArgs e)
{
string sFirst = Request.Form["Text1"];
if (sFirst != null) { TextBox1.Text = sFirst;}

}
</script>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>Untitled Page</title>
</head>
<body>
<form id="form1" runat="server">
<div>

</div>
<input id="Text1" type="text" runat="server" name="Text1" enableviewstate="true"/>
<asp:Button ID="Button1" runat="server" Text="Button" onclick="Button1_Click" />
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
</form>


</body>
</html>

البته حرف شما کاملا درست هست منم این برنامه را نوشتم و جوابی شبیه شما گرفتم.ولی.........
اینجا را بخون (http://aspadvice.com/blogs/joteke/archive/2004/03/15/2273.aspx)

RoostaYeBekr
پنج شنبه 21 آذر 1387, 18:58 عصر
با سلام و تشکر از راهنماییتون.

هم برنامه تون و هم لینکی که معرفی کردید ، خوب بود.

حالا به نظرتون این حرف من الان درسته :
که هر جا که نیاز به اطلاعات کنترل ها نداشتم ، بهتر است که ViewState را False کنم ؟

milade
پنج شنبه 21 آذر 1387, 19:38 عصر
بله !
هم پدر سرور توی پست بک در نمیاد هم کاربر برای لود صفحه!
موفق باشید

RoostaYeBekr
پنج شنبه 21 آذر 1387, 21:11 عصر
<%@ Page Language="C#" EnableViewState="False" EnableViewStateMac="False" %>




<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">


<script runat="server">


protected void Button1_Click(object sender, EventArgs e)
{
string sFirst = Request.Form["Text1"];
if (sFirst != null) { TextBox1.Text = sFirst;}


}
</script>


<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>Untitled Page</title>
</head>
<body>
<form id="form1" runat="server">
<div>


</div>
<input id="Text1" type="text" runat="server" name="Text1" enableviewstate="true"/>
<asp:Button ID="Button1" runat="server" Text="Button" onclick="Button1_Click" />
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
</form>



</body>
</html>



البته حرف شما کاملا درست هست منم این برنامه را نوشتم و جوابی شبیه شما گرفتم.ولی.........



اینجا را بخون (http://aspadvice.com/blogs/joteke/archive/2004/03/15/2273.aspx)



با سلام . یک چیز کوچک ( البته فکر کنم اشتباه لپی کردید ) :
این EnableViewState را در کامپوننت Text1 حتی اگر True نمی کردید ، برنامه ی شما ، همان جوری کار می کرد که این ویژگی نبود. آخه به نظرم علت اینکه سمت Server ، کامپوننت Text1 را شناخته ، بدلیل آن runat=server ی است که برای این کامپوننت گذاشتید و نه به خاطر True کردن EnableViewState .

محمدامین شریفی
جمعه 22 آذر 1387, 06:39 صبح
درسته.من مگه چیز دیگری گفتم.
هر وقت هم که کنترل های html نیاز هات رو برطرف کرد،بهتر است ازآن ها استفاده کنی

RoostaYeBekr
جمعه 22 آذر 1387, 11:23 صبح
درسته.من مگه چیز دیگری گفتم.
هر وقت هم که کنترل های html نیاز هات رو برطرف کرد،بهتر است ازآن ها استفاده کنی
با سلام

چون قبلا گفته بودید که ما می توانیم EnableViewState صفحه را False کنیم و بعد هر کامپوننتی که لازمش داشت ، True ش کنیم ، گفتم نکند به خاطر این مسئله این کار را کرده اید. در حالیکه به این علت کدهایی که فرستادید ، جواب می دهد که عبارت runat=server را برای Text1 گذاشته اید . یعنی به خاطر enableviewstate=true نیست.


درسته.من مگه چیز دیگری گفتم.



<input id="Text1" type="text" runat="server" name="Text1" enableviewstate="true"/>

محمدامین شریفی
جمعه 22 آذر 1387, 12:09 عصر
میخواستم ببینم که cache دخالتی در این قضیه دارد یا خیر.
بعدش هم 2 تا کنترل input گذاشتم ببینم enablestate در متن ها اثری میگذارد یا خیر،دیدم حرف شما درست است.:بوس:

محمدامین شریفی
جمعه 22 آذر 1387, 19:13 عصر
از ایده ها و نظرات بجای آقای RoostaYeBekr :تشویق:کمال سپاس رادارم.من که خیلی از برنامه هایشان خوشم میاد،چون به مسائل کوچکی که خیلی ها به سادگی از آن رد میشوند کاملا دقت میکند.
بچه ها این 2 تا نظر جالب در این باره :


When you submit a form to a server, the browser always send the field values
(those who are named, not disabled and inside the form) to the server. This
is how a HTML form works "by design".

The "viewstate" is just an hidden field added by ASP.NET to store extra
informations and carry them over accross multiple server side executions of
the same page. It doesn't contains field values.

Patrice


With asp.net you can have "server side validators" , a feature
not present in "old" asp (or jsp, or php, or ..).
When a validator blocks a page, the user gets his/her page
back, complete with all (ok, nearly all: password is an exception)
values and the now-visible validator text.
If the input gets cleared after every postback, your user would need to
retype that input every time the validator blocks submission.

You, as the developer, can decide when the data is safe in the database
and only then clear the form. You could do this by clearing every named
input, or by writing a procedure that loops through all controls on the
page, clearing them in an appropriate manner.

Hans Kesting


پیروز باشید

محمدامین شریفی
جمعه 22 آذر 1387, 19:16 عصر
دوستان من صفحه ها 2 بار اجرا کردم یک بار با viewstate را فعال کردم و بار دیگر غیر فعال در هر 2 بار یک جواب را مشاهده کردم.البته هیچ کاری که باعث eventwireup بشه را انجام ندادم.میخواهم بدانم چرا فرمم دارای hidden است؟




<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head><title>
Untitled Page
</title></head>
<body>
<form name="form1" method="post" action="Default2.aspx" id="form1">
<div>
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUKLTE2OTAzMjAwMmRkx0GkInc1sazSpC9X9/UQD/HwWvY=" />
</div>



<input id="Text1" type="text" />
<input name="valueOfInput" type="text" id="valueOfInput" value="valueOfInput :/wEPDwUKLTE2OTAzMjAwMmRkx0GkInc1sazSpC9X9/UQD/HwWvY=" />

<input type="submit" name="ctl02" value="Button" />

<div>

<input type="hidden" name="__EVENTVALIDATION" id="__EVENTVALIDATION" value="/wEWAwKNjK6lAgLh4f+cAgKfwImNC5QtJbfBMAHafDxjhWc2wj2 uL9lH" />
</div></form>
</body>

</html>

milade
جمعه 22 آذر 1387, 19:41 عصر
سلام
دقیق نمیدونم اما فکر کنم برا یه چیز امنیتی و اعتبار سنجی هست که توی صفحه گزاشتیده(نمیدونم)
لطفا سورس asp.net رو بدید
موفق باشید

RoostaYeBekr
جمعه 22 آذر 1387, 21:02 عصر
میخواهم بدانم چرا فرمم دارای hidden است؟


http://www.sleezo.com/imgs/2008/dec/12/yyc2.png

-------------------------------------------
:لبخندساده:
حالا یک چیز دیگه همینطوری فرستادم :

طریقه ی Deserializeکردن اطلاعات viewState :

البته اینی که می گم ، مربوط به اون hidden ی است که ما روی صفحه ی وب ، کلیک راست می کنیم و بعد View Source را می زنیم.

داده ی اون رو برمی داریم و بعد در متد زیر می گذاریم:


// viewStateString contains the view state information.
// Convert the Base64 string to an ordinary array of bytes
// representing ASCII characters.
string viewStateString = "/wEPDwUKLTE2MjY5MTY1NQ9kFgICAw9kFgICAQ8PFgIeBFRleHQ FDEhlbGxvIFdvcmxkIWRkZPsbiNOyNAufEt7OvNIbVYcGWHqf";
byte[] stringBytes = Convert.FromBase64String(viewStateString);
// Deserialize and display the string.
string decodedViewState = System.Text.Encoding.ASCII.GetString(stringBytes);
TextBox1.Text = decodedViewState;


البته فکر کنم اگر این داده ها رو Encode کنیم ، متد بالا جواب نده.بنابراین برای اینکه متد هک بالا جواب نده ، باید Encode اش کنیم.به خاطر همین هم هست که می گویند که اطلاعات مهم نباید حتی در hidden ها ذخیره شود.