C# - Store Viewstate In The Session Rather Than Bulking Up The HTML
Jan 7, 2011
I'm trying to get asp.net to store viewstate in the session rather than bulking up the html.
Now i've read that asp.net comes with the SessionPageStatePersister which can be used instead of the default HiddenFieldPageStatePersister to do this. I was wondering how i go about dropping it in?
This is what i've got so far:
I think i need to create a PageAdapter that returns a SessionPageStatePersister from its GetStatePersister method, and somehow get the page to use this pageadapter. But Page.PageAdapter only has a getter, so i'm not sure how you set it.
I would like to store this data once for aspx page. When the user selects different options in the page, data is further selected from the already stored DataTable.
I tried using the ViewState, but as soon as the data grows beyond 100 rows, performance degrades.
Its related to datatable in gridview store in session and then session retrive and store to database. basically i am using gridview here creating new row for button click and these row adding untill user's last entry then submit all these entry to database. so i want to use session variable to store this data temporarily and after final entry user click on submit button and all data shold be save in db.
I can tried save some data to ViewState, but i get this Error:
Microsoft JScript runtime error: Sys.WebForms.PageRequestManagerServerErrorException: Error serializing value 'HeRMeSSAAS.BussinesProcess.BussinesServices.CandidateService' of type 'HeRMeSSAAS.BussinesProcess.BussinesServices.CandidateService.' Code:
private IActionService ActionService { get [code]... How i can store value to ViewState?
EDIT: ViewState does not change when browser is refreshed, so even if you write to viewstate it will not save the data. i am trying to store a Queue in a viewstate (to track postbacks and refreshes to stop a form from resubmitting). The Queue is only saving with a count of 1 (the first item that is added to it) no matter how many items i add.
// New Queue of strings private Queue<string> sTemp; private Queue<string> p_tempQue { set { ViewState["sTemp"] = value; } get { return (Queue<string>)ViewState["sTemp"]; } } //BasePage constructor public BasePage() { //create a Queue of string //sTemp = new Queue<string>(); this.Load += new EventHandler(this.Page_Load); this.Init += new EventHandler(this.Page_Init); } //In the 'page_Init' event we have created a simple hidden field by name 'hdnGuid' which is attached to the page on the first hit itself. protected void Page_Init(object sender, EventArgs e) { //initializing the hidden field //create a hidden field with a ID HiddenField hdnGuid = new HiddenField(); hdnGuid.ID = "hdnGuid"; //if it is the first time the page is loaded, create a new guid and assign it as the hidden field value if (!Page.IsPostBack) hdnGuid.Value = Guid.NewGuid().ToString(); //add the hidden field to the page Page.Form.Controls.Add(hdnGuid); } //In the 'page_Load' event we check if the hidden field value is same as the old value. In case the value is not same that means it's a 'postback' //and if the value is same then its 'refresh'. As per situation we set the 'httpContent.Items["Refresh"]' value. protected void Page_Load(object sender, EventArgs e) { if(p_tempQue != null) sTemp = p_tempQue; else sTemp = new Queue<string>(); //The hdnGuid will be set the first time page is loaded, else the hdnGuid //will be set after each time the form is submitted using javascript. //assign the hidden field currently on the page for manipulation HiddenField h1 = (HiddenField)(Page.Form.FindControl("hdnGuid")); //create an instance of the GuidClass GuidClass currentGuid = new GuidClass(); //set the GuidClass Guid property to the value of the hidden field currentGuid.Guid = h1.Value; //check to see if the Queue of strings contains the string which is the current Guid property of the GuidClass //if the are equal, then the page was refreshed if (sTemp.Contains<string>(currentGuid.Guid)) { //adds item as key/value pair to share data between an System.Web.IHttpModule interface and an System.Web.IHttpHandler interface during an HTTP request. System.Web.HttpContext.Current.Items.Add("IsRefresh", true); } //if they are not requal, the page is not refreshed else { //if the current Guid property in the GuidClass is not null or not an empty string //add the new Guid to the Queue if (!(currentGuid.Guid.Equals(null) || currentGuid.Guid.Equals(""))) sTemp.Enqueue(currentGuid.Guid); System.Web.HttpContext.Current.Items.Add("IsRefresh", false); } p_tempQue = sTemp; }
I want to store List<Class> object to ViewState, when i try to do this than its giving me error to make class serialize,but my class is partial class so didn't get serialize keyword on class how can i store List object to viewstate.
i want to store IQueryable value to ViewState. my code is as below:
Private Property _Query() As IQueryable Get Return CType(ViewState("_Query"), IQueryable) End Get Set(ByVal value As IQueryable) ViewState("_Query") = value End Set
but when i run my page i get following error:
Type 'System.Data.Linq.DataQuery`1[[DynamicQueries.VW_EmployeeProfile_Filter, DynamicQueries, ersion=1.0.0.0, Culture=neutral, PublicKeyToken=null]]' in Assembly 'System.Data.Linq, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' is not marked as serializable
what should i do to get rid of this error. previously i was doing like this:
Private Shared _Query As IQueryable
but problem is that in Multi users environament, Shared variable is making problem, that is why i want to store it in ViewState.
I have a class called EditMapUtilities. Here are some class properties that I want to persist:
public class EditMapUtlities { public static Boolean isInitialEditMapPageLoad { get { return SessionHandler.isInitialEditMapPageLoad; } set { SessionHandler.isInitialEditMapPageLoad = value; } } // REST OF CLASS NOT GERMAIN TO DISCUSSION AND OMITTED }
Here is my SessionHandler Class following the pattern from this post Static Session Class and Multiple Users: using System.Web.SessionState;
public static class SessionHandler { private static HttpSessionState currentSession { get { if (HttpContext.Current.Session == null) throw new Exception("Session is not available in the current context."); else return HttpContext.Current.Session; } } //A boolean type session variable private static string _isInitialEditMapPageLoad = "EditMapInitialPageLoad"; public static bool isInitialEditMapPageLoad { get { if (currentSession[_isInitialEditMapPageLoad] == null) return true; else return (Boolean)currentSession[_isInitialEditMapPageLoad]; } set { currentSession[_isInitialEditMapPageLoad] = value; } } }
I am still learning OOAD. I want to keep relevant properties with relevant classes. I also want to keep all Session stored variables in one place for ease of maintenance and to encapsulate the session keys and calls. I feel like my design is too coupled though. How can I make it more loosely coupled? Is my editMapUtilities class too tightly coupled to the SessionHandler class? How would you do it better?
How do you store multi-dimensional array to viewstate? Here's what I did: public bool[,,] regsettings = new bool[7,5,4]; bool[,,] regsettings = (bool[,,])ViewState["regsettings"]; // this line works! regsettings[i,j,tab] = (bool)ViewState["regsettings"]; // this line no working?! The error is: Object reference not set to an instance of an object. The letters i,j, tab are just variables in the loop. They are there. I also tried: (bool[,,,]) as a cast and it is a no-go either.?
The Title pretty much says it all but to clarify more I have a page with private properties that are storing a credit card object and a shopping cart object in viewstate so I can maintain a reference to them across postbacks. BTW the page involved will be using ssl. Is this safe?
The values of this class are set at postback by clicking a radiobutton list. Problem however is I don't know how to save this values across multiple postbacks. I thought of using viewstate but I'm not quite sure how to do it with this class.
In my website the page viewstate values in hidden are very large.So i wish to store this values into another methods(session,files etc).so please advice me to some methods..
I have a public property that I use to store a GUID in the viewState:
Property myGUID() As Guid Get Return CType(Me.ViewState("myGUID"), Guid) End Get Set(ByVal value As Guid) Me.ViewState("myGUID") = value End Set End Property
I include this code on many pages in my website...is there any way to migrate this to a common code file, so I don't have to repeat it on each page? If I try to add it to a class file, the "Me" part of course is out of scope.
i have deployed my website on a particular server. i have some limitations in using viewstate and session variables. those pages in which i have used ViewState variables (for storing some information), i user accesses that page and does not do any activity for 5 minutes and if after 5 minutes he does any kind of activity (click on Link or button etc) then he receives following error: "Validation of viewstate MAC failed. If this application is hosted by a Web Farm or cluster, ensure that configuration specifies the same validationKey and validation algorithm. AutoGenerate cannot be used in a cluster."
how i can avoid above error? another problem is with session. My session expires just after 2-3 minutes. What should i do for maintaining session for long time? i can not use cookies, as if user has disabled the cookies then my website will not work...
i have deployed my website on a particular server. i have some limitations in using viewstate and session variables.
those pages in which i have used ViewState variables (for storing some information), i user accesses that page and does not do any activity for 5 minutes and if after 5 minutes he does any kind of activity (click on Link or button etc) then he receives following error:
"Validation of viewstate MAC failed. If this application is hosted by a Web Farm or cluster, ensure that configuration specifies the same validationKey and validation algorithm. AutoGenerate cannot be used in a cluster."
another problem is with session. My session expires just after 2-3 minutes. What should i do for maintaining session for long time? i can not use cookies, as if user has disabled the cookies then my website will not work...
I am designing a site with that requires users to login in to access info. How do I save the user name and password in viewstate or session. so I can use it in other pages later.
i have two text boxes and one button in web form. I need to display the contents of text boxes in a datatable in the same form, when i click on the button.
How can i do this using session array. I need to store values in session array. and get back the values from session when i need .
if my website when session of user expire i get the following error.
Validation of viewstate MAC failed. If this application is hosted by a Web Farm or cluster, ensure that <machineKey> configuration specifies the same validationKey and validation algorithm. AutoGenerate cannot be used in a cluster.
Currently in an .aspx file, I am storing a value (filename that was created in that session) in an hidden text box. When the user clicks on the "Print" labeled Hyperlink control, it opens the file that was stored in the hidden text box control. But when the user goes to different screen (in the same session), I loose the filename value that is stored in the hidden text box control. So I would like to store the filename variable in a session variable. So that if the user leaves this .aspx file and comes back to this .aspx file I can load the value into the hidden text box from the session variable.