PDA

View Full Version : مستر پیج و وضعیت کنترل های موجود در آن



shahab_ksh
پنج شنبه 22 آذر 1386, 18:20 عصر
من یه صفحه مستر پیج دارم که درون اون یه DropDownList هست و چند صفحه دیگه که از این مستر پیج استفاده حال در نظر بگیرید در صفحه a شما یکی از ایتمهای DropDownList رو انتخاب کردید و به صفحه دیگری مانند b می رویم اما DropDownList وضعیت قبلیشو نگه نمیداره و انگار ریست میشه من با آقای راد در یک پست در این مورد بحث کردیم نتیجه این شد ممکنه یه باگ باشه اما در هاست همچنان این مشکل وجود داره در فرام www.asp.net (http://www.asp.net) مطرح کردم یکی به این شکل جواب داد


What you are doing is not a master page concept. You are thinking that when i set some value of a control which is placed in a master page, it will act like a shared item. While its not the case. Master page is a simple a common supplier of layout. While controls viewstate is per page, not per master page.


آیا درست میگه ؟!

کد صفحه مستر پیج من و کل پروژه رو هم بصورت یه فایل میزارم ببینید مشکل کجاست؟




<%@ Master Language="VB" CodeFile="MasterPage.master.vb" Inherits="MasterPage" %>
<!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>

<asp:DropDownList ID="DropDownList1" runat="server">
<asp:ListItem>A</asp:ListItem>
<asp:ListItem>B</asp:ListItem>
<asp:ListItem>C</asp:ListItem>
</asp:DropDownList><br />

<asp:contentplaceholder id="ContentPlaceHolder1" runat="server">
</asp:contentplaceholder>
</div>
</form>
</body>
</html>

miladr
پنج شنبه 22 آذر 1386, 18:25 عصر
حرفش درسته.viewstat به ازای هر صفحه با صفحه قبل متفاوت هست.

مهدی کرامتی
پنج شنبه 22 آذر 1386, 19:23 عصر
کنترل ها و عناصر دیگری که در MasterPage قرار می دهید در هر صفحه مجزا، مجددا ، و بعنوان بخشی از محتوای آن صفحه خاص Render میشوند. بنابراین State کنترل های آن به ازای صفحات مختلف متفاوت خواهد بود.

اگر میخواهید State یک کنترل خاص را در حین جابجایی در صفحات مختلف حفظ کنید میبایست اینکار را بصورت دستی انجام دهید:


public partial class Site1 : System.Web.UI.MasterPage
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack && Session["ddlValue"] != null)
DropDownList1.SelectedValue = Session["ddlValue"].ToString();
}

protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
{
Session["ddlValue"] = DropDownList1.SelectedValue;
}
}

shahab_ksh
پنج شنبه 22 آذر 1386, 20:17 عصر
باز هم کار نکرد انگار که


Session("ddlValue")

مقدار نمیگیره کوکی IEهم فعاله

Behrouz_Rad
پنج شنبه 22 آذر 1386, 20:36 عصر
من یه صفحه مستر پیج دارم که درون اون یه DropDownList هست و چند صفحه دیگه که از این مستر پیج استفاده حال در نظر بگیرید در صفحه a شما یکی از ایتمهای DropDownList رو انتخاب کردید و به صفحه دیگری مانند b می رویم اما DropDownList وضعیت قبلیشو نگه نمیداره و انگار ریست میشه من با آقای راد در یک پست در این مورد بحث کردیم نتیجه این شد ممکنه یه باگ باشه اما در هاست همچنان این مشکل وجود داره

برادر شهاب، در حال حاضر فک بنده بر روی زمین تشریف داره!!!
شما در اون تاپیک (http://barnamenevis.org/forum/showthread.php?t=87488) (که البته بهتر بود تاپیک جدید ایجاد نمی کردی) هیچ گونه اشاره ای به رفتن به صفحه ی دیگه یعنی در حقیقت Redirect نکردی!
پر واضح هست که ViewState تنها در صفحه ی جاری معنا داره و نه در هنگام رفتن از یک صفحه به صفحه ی دیگه!!!
ViewState فقط و فقط در صفحه ی جاری و در زمان PostBack به همون صفحه معنا پیدا می کنه...

موفق و واضح گو باشید. ;)

shahab_ksh
پنج شنبه 22 آذر 1386, 20:38 عصر
حال راه حل چی به نظرتون میرسه ؟! میشه در تمام صفحات کنترل DropDownList رو گذاشت و به همون روشی که
DelphiAssistant (http://barnamenevis.org/forum/member.php?u=1206) فرمودند عمل کرد اما آیا فکری برای این نشده اگه DropDownList در مستر پیج باشه چطوری این مشکل حل میشه ؟!

Behrouz_Rad
پنج شنبه 22 آذر 1386, 21:22 عصر
اصولا مشکل شما ارتباطی با Master Page نداره.
وقتی از صفحه ای به صفحه ی دیگه میری، وضعیت کنترل های دیگه هم از بین میره. چون صفحه ای وجود نداره که وضعیت کنترلی برای اون نگه داشته بشه.
راه حلی جناب کرامتی راه حل متداول و خوبی برای این مواقع هست.

موفق باشید.

پ.ن: اگر راه حل دیگه ای به نظرم رسید در همین تاپیک عرض می کنم.

mehrdad201
پنج شنبه 22 آذر 1386, 21:55 عصر
من قبلا شبیه این مشکل رو داشتم

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

اما اومدم از server.transfer استفاده کردم و مشکلم حل شد.

امیدوارم که این کمکت کنه دوست عزیز

shahab_ksh
جمعه 23 آذر 1386, 00:00 صبح
از همه دوستان ممنون

Behrouz_Rad
جمعه 23 آذر 1386, 16:46 عصر
من کمی روی این موضوع کار کردم چون به نظرم جالب رسید و موفق شدم روش جالبی رو پیاده سازی کنم.
روشی که پیاده سازی کردم، استفاده از همون Session برای نگهداری وضعیت هست + دستکاری روال هایی که در مدیریت حفظ وضعیت کنترل ها نقش دارند.
دو روال اساسی در این بین نقش دارند. SavePageStateToPersistenceMedium و LoadPageStateFromPersistenceMedium.
من این دو روال رو Override کردم و مدیریت ViewState رو خودم بر عهده گرفتم.
وقتی که فرم به سرور PostBack میشه، روال SavePageStateToPersistenceMedium فراخوانی میشه که وضعیت کنترل ها رو ذخیره می کنه.
در روال کلیک یک دکمه من یک آیتم با نام go و مقدار true رو در Context ذخیره کردم و در روال فوق بررسی کردم که اگر عملیات PostBack توسط دکمه ی مورد نظر من انجام شده بود، کل ViewState صفحه رو به جای اینکه در صفحه ذخیره کنه، در یک Session قرار بده و سپس کاربر رو به صفحه ی دیگری "Redirect" کنه. توجه کنید که Redirect و نه PostBack !
در صفحه ی مقصد فقط یک دکمه وجود داره که با کلیک بر روی اون به صفحه ی مبدا Redirect میشید.
یکی از روال های چرخه ی حیات یک صفحه، روال LoadPageStateFromPersistenceMedium هست که فقط در صورتی که صفحه به خودش PostBack شده باشه فراخوانی میشه و این مورد رو با بررسی روال DeterminePostBackMode متوجه میشه. من این روال رو هم Override کردم و در زمان ورود به این صفحه، با بررسی داشتن مقدار برای Session، یک PostBack مجازی رو با برگشت مقدار Request.Form ایجاد می کنم که موجب میشه روال LoadPageStateFromPersistenceMedium گول بخوره و فکر کنه صفحه در اثر PostBack به خودش لود شده نه از طریق Redirect!

نکته ی مهم دیگه این هست که وقتی مدیریت ViewState رو خودتون بر عهده می گیرید، باید روال هایی از کنترل ها که موجب ایجاد تغییر مقدار یک کنترل میشن رو هم Override کنید. مثلا روال TextChanged برای TextBox ها و SelectedIndexChanged برای DropDownList ها و ...
اگر این روال ها رو Override نکنید، روال SavePageStateToPersistenceMedium برای این کنترل ها فراخوانی نمیشه و حالتشون در ViewState قرار نمی گیره.

این طریق پیاده سازی نیاز برنامه نویس رو برای مدیریت وضعیت تک تک کنترل ها بر طرف می کنه.

پروژه ی نمونه رو دانلود کنید تا بهتر متوجه قضیه بشید.


موفق باشید.