View Full Version : متغییر سراسری
bfreind10
چهارشنبه 14 مهر 1389, 17:51 عصر
سلام
دست بوس همه اساتید هستم
سوالی داشتم که خیلی برام مهمه تا الان هم همش با Session کار کردم برای اینکه هیچ وقت درست طرز تعرفش رو ندونستم. فکر کنم بعضی از دات نت کارا هم مثل من مشکلاتی از این دست دارند.
کد زیر را ببینید:
Partial Class Default2
Inherits System.Web.UI.Page
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Dim sum As Integer
sum = 1
End Sub
Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
Response.Write(sum)
End Sub
End Class
متغییر sum از داخل سابروتین Button1_Click قابل دسترسی نیست چیکار کنم؟
majnun
چهارشنبه 14 مهر 1389, 18:04 عصر
خب Sum درون تابع پیج لود تعریف شده توسط توابع دیگر قابل دسترسی نیست دیگه
متغیر پابلیک تغریف کن درون کلاس :لبخند:
bfreind10
چهارشنبه 14 مهر 1389, 18:30 عصر
میدونم رئیس ولی میخواستم بیشتر توضیح بدین
من این کارو کردم ولی همواره هر مقداری بهش میدم توی page load توی botton صفر بر میگردونه.
اگه ممکنه برام طریقه تعریفشو بنویسید
ممنون
majnun
چهارشنبه 14 مهر 1389, 18:38 عصر
خب شما وقتی روی باتن کلیک میکنید صفحه پست بک میخوره مقدار به همون مقداری که هنگام نعریف گذاشتین بر میگرده
شما بیا توی پیج لود مقدار را درون یک ویو استیت یا سشن بریز و دورباره در رویداد کلیک باتن اونو بگیر
اکه نتونستی بگو نمونه کد بدم
bfreind10
چهارشنبه 14 مهر 1389, 19:16 عصر
من خودم از Session استفاده می کنم ولی آیا این با وجود انواع متغییر ها و اسکوپ های مختلف آنها کار درستی است؟ چون session بعد از مدتی مقدار خود را از دست می دهد و شما محتوی متغییر خود را از دست می دهید و با در پروژه های بزرگ شاید به کانفلیت هایی برخورد کنیم مثلا Session("id") در یک بخش و در قسمت دیگر هم ممکن است وجود داشته باشدک من خودم به شخصه احساس خوبی در استفاده از session ندارم و به خاطر همین میترسم راهم اشتباه باشد.
از همه اساتید کمک میخوام
majnun
چهارشنبه 14 مهر 1389, 19:54 عصر
خب میتونید از ویو استیت استفاده کنید
در ضمن میتونید زمان عمر سشن ها رو در وب کانفیگ زیاد کنید
Vahid_moghaddam
چهارشنبه 14 مهر 1389, 21:06 عصر
درباره application state، session state و view state مطالعه کنید. این ها رو نباید به جای هم به کار برد. هر کدوم هم مزایا و معایب خودشون رو دارند.
raziee
چهارشنبه 14 مهر 1389, 21:57 عصر
سلام
دست بوس همه اساتید هستم
سوالی داشتم که خیلی برام مهمه تا الان هم همش با Session کار کردم برای اینکه هیچ وقت درست طرز تعرفش رو ندونستم. فکر کنم بعضی از دات نت کارا هم مثل من مشکلاتی از این دست دارند.
کد زیر را ببینید:
Partial Class Default2
Inherits System.Web.UI.Page
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Dim sum As Integer
sum = 1
End Sub
Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
Response.Write(sum)
End Sub
End Class
متغییر sum از داخل سابروتین Button1_Click قابل دسترسی نیست چیکار کنم؟
بهترین کار استفاده از یک ViewState هست.
ViewState ها در یک صفحه قابل دسترس هستند.(و نه در کل پروژه)
کار دیگه ای که میتونید انجام بدید ای هست که یک Properties بنویسید که get رو از viewstate بگیره و set رو هم در یک viewstate بکنه.
استفاده از سشن مناسب نیست(تا اونجایی که میتونید از سشن استفاده نکنید(به طور کلی))
raziee
چهارشنبه 14 مهر 1389, 22:27 عصر
این رو آزمایش کنید.
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<b><asp:Literal ID="litDisplay" runat="server"></asp:Literal></b><br />
<asp:Button ID="btnAddition" runat="server" Text="++"
onclick="btnAddition_Click" /> |
<asp:Button ID="btnSubtraction" runat="server" Text="--"
onclick="btnSubtraction_Click" />
</div>
</form>
</body>
</html>
#region Properties
public int Sum
{
get
{
return (int)ViewState["sum"];
}
set
{
ViewState["sum"] = value;
}
}
#endregion
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
this.Sum = 1;
litDisplay.Text = Sum.ToString();
}
}
protected void btnAddition_Click(object sender, EventArgs e)
{
Sum++;
litDisplay.Text = Sum.ToString();
}
protected void btnSubtraction_Click(object sender, EventArgs e)
{
Sum--;
litDisplay.Text = Sum.ToString();
}
اگه این مقدار رو در ViewState ذخیره نکنیم و به کلاینت نفرستیم هربار که مقدار این متغیر درخوایت بشه، مقدار پیشفرض گرفته میشه.
علت:
هر بار که درخواستی برای یک صفحه(برای اولین بار) به سرور فرستاده میشه هر چیزی که در صفحه باشه یکبار ساخته میشه(جدید) و به کلاینت فرستاده میشه.
زمانی که کاربر(کلاینت) همون صفحه رو Post میکنه وضعیت های اشیاء رو هم ارسال میکنه. ولی وضعیتی برای اون متغیر در کلاینت ذخیره نشده بنابر این در سرور دوباره از اون متغیر جدید ساخته میشه و مقدار پیشفرض رو میگیره.
majnun
چهارشنبه 14 مهر 1389, 22:28 عصر
ببخشید دلیل استفاده نکردن از سشن چیه ؟
من همیشه از سشن استفاده میکنم
مخصوصا برای اعتبار سنجی در وب
مشکلش کجاست ؟
raziee
پنج شنبه 15 مهر 1389, 00:33 صبح
ببخشید دلیل استفاده نکردن از سشن چیه ؟
من همیشه از سشن استفاده میکنم
مخصوصا برای اعتبار سنجی در وب
مشکلش کجاست ؟
در یک پستی از جناب راد خوندم که پیکر بندی نا صحیح آنتی ویروس ها باعث از بین رفتن سشن میشه.
استفاده از سشن در این موارد کار بار اضافی بر سرور میاره.
حساب کنید که ما 4 تا متغیر در 4 صفحه داشته باشیم و تعداد بازدید صفحه هم مثلا 100 تا در 30 دقیقه باشه. اگه زمان انقضاء سشن رو 30 دقیقه تعریف کرده باشیم و هر کاربر فقط یکبار این 4 صفحه رو درخواست بده خواهیم داشت:
4 صفحه * 4 متغیر * 100 درخواست
حالا این رو در نوع متغیر ضرب کنید میشه حجمی که در RAM سرور گرفته میشه.
با توجه به اینکه اکثر سایت ها از سرور اختصاصی استفاده نمیکنند حجم قابل توجهی میشه.
حالا اگه این مقدار برای ما دارای اهمیت باشه(یکسری محاسبات روش انجام بشه) و مقدارش از بین بره اونوقت چی؟
اگر اشتباه میکنم اساتید بزرگوار راهنمایی کنند.
bfreind10
پنج شنبه 15 مهر 1389, 06:48 صبح
من هم با جناب رضیئی موافقم. پرواضح هستش که سشن دردسر سازه!
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.