الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

الحفاظ على قيم الobject بعد عمل Postback

بدأه majed123 في 15 مارس 2008 · 9 رد · 962 مشاهدة · في ASP.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

فى حالة تعريف object عام فى صفحة معينة وتم اعطائه قيم لخصائصة التي تم تعريفها مسبقا في كلاس Class والضغط على اى زر فى الصفحة يتم تفريغ لهذه الخصائص

مثال

Public Class MyPage
	Inherits Page

Dim oObject as new clsClass




 Protected Sub lnkGetData_Click(ByVal sender As Object, ByVal e As ystem.Web.UI.ImageClickEventArgs)
Handles lnkGetData.Click

	oObject.Propert1 =5
 End sub

 Protected Sub lnkUpdate_Click(ByVal sender As Object, ByVal e As ystem.Web.UI.ImageClickEventArgs)
Handles lnkUpdate.Click

   lblDisplay.text = oObject.Propert1 
 End sub

oObject.Propert1 return 0 not 5 in lnkUpdate Click

لاحظ أن oObject.Propert1 ترجع قيمة 0 وليس 5

كيف يتم زيادة عمر ال Object Lifetime ؟

PMI_Logo_1.jpg

مدير مشاريع محترف - PMP
محلل أنظمة معتمد
مدير فريق برمجة تطبيقات ويب .Net

======|||||=====

======@ @====
==o0o== ( ) ==o0o===
================
كل منا يحتاج إلى الإرادة حتى يستطيع أن يقوم بعمله

#2

جرب أخي الكريم زيادة الخاصية static للكائن Object المراد ثباته بالذاكرة بين Postbacks

public static clsClass

ASP.NET Team Leader

moh_kin_mah@hotmail.com

--------------------------------

لو أعجبك أي من مشاركاتي ... برجاء قم بتقييم المشاركة عبر الأزرار الموجودة أسفل يسار كل مشاركة

#3

Static في ال Vb يقابلها Shared

المشكلة في حالة تعريف أكثر من Instance من نفس الClass سوف يشتركوا بنفس قيم الخصائص للClass

PMI_Logo_1.jpg

مدير مشاريع محترف - PMP
محلل أنظمة معتمد
مدير فريق برمجة تطبيقات ويب .Net

======|||||=====

======@ @====
==o0o== ( ) ==o0o===
================
كل منا يحتاج إلى الإرادة حتى يستطيع أن يقوم بعمله

#4

في الـASP.NET جميع الـobjects ما عدا الـshared يعاد تكوينها من جديد مع كل postback لذا الطريقة الوحيدة للاحتفاظ بها هو حفظها في مكانٍ ما كالسيشن session مثلاً.

#5

سؤال أخي الكريم

هل ينطبق كذلك على لغة #C أم أنه فقط باستخدام Vb أم أن الموضوع عام باستخدام ASP.Net

وهل هناك فروقات بين اللغتين بخصوص هذا الموضوع

أرى أن استخدام ال Session مرهق وغير منطقي في هذه الحالة لأن عدد ال Objects كثيرة، فربما أفضل طريقة هو إعادة إنشاء ال Object مرة أخرى، أم أنك ترى أن هذا غير صحيح؟؟؟؟؟؟؟؟؟؟؟

PMI_Logo_1.jpg

مدير مشاريع محترف - PMP
محلل أنظمة معتمد
مدير فريق برمجة تطبيقات ويب .Net

======|||||=====

======@ @====
==o0o== ( ) ==o0o===
================
كل منا يحتاج إلى الإرادة حتى يستطيع أن يقوم بعمله

#6
هل ينطبق كذلك على لغة #C أم أنه فقط باستخدام Vb أم أن الموضوع عام باستخدام ASP.Net

وهل هناك فروقات بين اللغتين بخصوص هذا الموضوع

اخي الكلاسات .net التي تستخدم بـvb هي نفسها بـC# ولا يوجد اي اختلاف الاختلاف فقط الـsyntax

أرى أن استخدام ال Session مرهق وغير منطقي في هذه الحالة لأن عدد ال Objects كثيرة، فربما أفضل طريقة هو إعادة إنشاء ال Object مرة أخرى، أم أنك ترى أن هذا غير صحيح؟؟؟؟؟؟؟؟؟؟؟

هذا صحيح اخي لان الـsession يخزن بالذاكرة السيرفر ويستهلك من موارد السيرفر , طيب اخي جرب ان تستخدم الـviewstate لان الـviewstate يخزن ضمن الصفحة وهو على مستوى الصفحة مع اني افضل طريقة انشاء Objects من جديد بكل مرة

-----------------------------------------------------------------------------------------------------------------------------





 

ـــــــــــــــــــــــــــــــــــــــــــــــــــــــــ

Mohammad Sonaiea
 

#7

يمكنك أخي تجربة ViewState ولكن ... لاحظ جيداً التالي .. أن ViewState الخاص بكل صفحة غير الأخرى .. أي باستخدام ViewState يمكنك الحفاظ على Objects بين Postbacks على نفس الصفحة فقط .. ولكن عند الانتقال إلى صفحة أخرى تتلاشى ..

يمكنك أخي الحبيب أن تعمل static أو shared للـ Class وهذا أفضل حل أراه لو احتجت عملياً الحفاظ على هذه Objects بين Potbacks ولا سيما لو كانت بين عدد من الصفحات وليس صفحة واحدة ..

ويمكنك أن تجرب أن تحفظها في Session وتجرب الموقع Online وترى الأداء .. وهي ليست مجهدة كما ذكرت ولكنها بسيطة جداً جداً

لحفظ القيمة

Session["anyKeyName"] = any Object;

ولاستدعاء القيمة

Class_Name object = (Class_Name) Session["anyKeyName"];

تم تعديل هذه المشاركة بواسطة moh_kin في 16 مارس 2008 في 11:51

ASP.NET Team Leader

moh_kin_mah@hotmail.com

--------------------------------

لو أعجبك أي من مشاركاتي ... برجاء قم بتقييم المشاركة عبر الأزرار الموجودة أسفل يسار كل مشاركة

#8
majed123 كتب:
هل ينطبق كذلك على لغة #C أم أنه فقط باستخدام Vb أم أن الموضوع عام باستخدام ASP.Net

هذا الكلام يمكنك أن تقول أنه ينطبق على جميع تطبيقات الويب بما فيها الـASP.NET بسبب طبيعة برتوكول HTTP.

بشكل عام هناك مكانان للتخزين مفتوحان أمامك. في السيرفر عن طريق الsession أو في جهاز المتصفح عن طريق الviewstate. لكل طريقة مميزاتها و عيوبها طبعاً.

بالنسبة لحجم البيانات الموجودة في الـsession، إذا كانت كمية البيانات كبيرة جداً يمكنك تخزين الـsession داخل قاعدة بيانات بدلاً من الذاكرة. التطبيق سيصبح أبطأ و لكنك ستتمكن من التعامل مع كمية بيانات أكبر.

#9

اذا كانت دورة حياة الكائن مرتبطة بالصفحة فالافضل وضعه في الviewstate

 ViewState["myobject"] = myobject;

اذا كانت الصفحة تتطلب عمل postback عدة مرات ,كالwizard مثلا, فان عمل override يكون افضل:

private MyCustomObject myObject;

	protected void Page_Load(object sender, EventArgs e)
	{

	}
	protected override object SaveViewState()
	{
		return new Triplet(base.SaveViewState(),myObject);
	}
	protected override void LoadViewState(object savedState)
	{
		base.LoadViewState(((Triplet)savedState).First);
		myObject = (MyCustomObject)((Triplet)savedState).Second;
	}

هذا الكود يضمن لك بقاء خصائص الكائن كما هي مهما عملت من postback

بالنسبة للكائنات التي تخص المستخدم فيمكن وضعها في السيشن ما لم تكن كبيرة والا فان احسن مكان هو ال Cache مع تحديد زمن ليس بالطويل كي يمكن افراغ الcache لاستخدامه في اغراض اخرى

#10
Imports Microsoft.VisualBasic
<SerializableAttribute()> _
Public Class User
	Public FirstName As String = ""
	Public LastName As String = ""
	Public Age As Int16 = 0
End Class

Imports Microsoft.VisualBasic
Imports System.Collections.Generic
Public Class Generalpage
	Inherits System.Web.UI.Page

	Public ViewList As New Dictionary(Of String, Object)

	Protected Overrides Function SaveViewState() As Object
		Return New Triplet(MyBase.SaveViewState(), ViewList)
	End Function

	Protected Overrides Sub LoadViewState(ByVal savedState As Object)
		MyBase.LoadViewState((CType(savedState, Triplet)).First)
		ViewList = CType((CType(savedState, Triplet)).Second, Dictionary(Of String, Object))
	End Sub
	Public Function getObject(ByVal name As String) As Object
		Try
			Return ViewList(name)
		Catch
			MsgBox("not found")
			Return Nothing
		End Try
	End Function
	Public Sub addObject(ByVal name As String, ByVal obj As Object)
		ViewList.Add(name, obj)
	End Sub
	Public Sub setObject(ByVal name As String, ByVal obj As Object)
		ViewList(name) = obj
	End Sub
	Public Sub DelObject(ByVal name As String, ByVal obj As Object)
		ViewList.Remove(name)
	End Sub
End Class

Partial Class _Default
	Inherits Generalpage
	Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
	End Sub
	Public user_ As User

	Protected Sub btnSet_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnAdd.Click
		user_ = New User()
		user_.FirstName = txtNameS.Text
		user_.LastName = txtLastS.Text
		Try
			user_.Age = CType(txtAgeS.Text, Integer)
		Catch
			user_.Age = 0
		End Try
		addObject(txtNameS.Text, user_)
		DropDownList1.DataSource = ViewList.Keys		
		DropDownList1.DataBind()
		DropDownList1.Items.Insert(0, "")
	End Sub


	Protected Sub DropDownList1_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles DropDownList1.SelectedIndexChanged
		Try
			user_ = CType(getObject(DropDownList1.SelectedItem.Text), User)
			txtNameG.Text = user_.FirstName
			txtLastG.Text = user_.LastName
			txtAgeG.Text = user_.Age.ToString()
		Catch
		End Try
	End Sub
End Class

post-127137-1205757094_thumb.jpg

viewstate.zip

تم تعديل هذه المشاركة بواسطة محمد سماقية في 17 مارس 2008 في 15:42

-----------------------------------------------------------------------------------------------------------------------------





 

ـــــــــــــــــــــــــــــــــــــــــــــــــــــــــ

Mohammad Sonaiea
 

مواضيع مشابهة