When Is It Ok To Meddle In The Page Lifecycle An .NET MVC Page
Jul 30, 2010
It seems that ASP.NET MVC just runs on top of ASP.NET WebForms. System.Web.Mvc.ViewPage in ASP.NET MVC inherits from System.Web.UI.Page which includes page lifecycle methods like OnRender and friends.
I have seen a couple of comments around the web to the effect that you should resist the urge to override these methods AT ALL COSTS!. Of course, this means that I find myself resisting the urge to do just that.Is there really that much wrong with something like the following?
public class SslPage : ViewPage
{
protected override void OnPreInit(EventArgs e)
{
// Make sure we are using SSL [code].....
One could debate the purity of putting that in a "View" but it seems plenty expedient.How dangerous/blasphemous is it to override these methods? When might it make sense?
I'm using a file manager-type WebControl that does lots of postbacks. It's placed inside a Page that is relatively complex. I would like to prevent the WebControl from causing the whole Page to go through the lifecycle.
Is there any way to isolate the WebControl from the rest of the Page? The only way I can think of is sticking the WebControl in a separate Page and creating an iframe in the original Page. Unfortunately that also means my WebControl properties/settings are no longer in the original Page. If I want two instances of the WebControl with different settings, then I have to create a Page for each setting and reference the correct one in my iframes. Not quite as "drag & drop" as I would like.
I have a ListView in a web form (c#/.net 4.0). There is an ImageButton in the ItemTemplate.
After a postback, the ItemCommand event fires... and then everythings stops. No other page events occur. (Actually there is one other thing: Dispose() from ExtenderControlBase runs right after the event code finishes - this site has some AjaxControltoolkit controls, though there are none on this particular page).
There are a lot of things involved here so it's not really practical to post all the code, but generally, is there anything that could cause this?
I am rebinding the ListView on each postback, because I'm handling paging on the server side. When I assign the data source to the ListView, it's initially going to have no rows. So at the time the command event fires, the DataSource has no data in it, since it hasn't yet been loaded from the database and rebound. I can't think why this would cause the entire page to just stop loading, though.
The template is just this:
<ItemTemplate> <tr> <td class="DataListRow"><asp:ImageButton ID="edit" runat="server" ImageUrl="~/images/nav/datagrid_edit.gif" CommandName="edit" /> </td> // a few orther cells </tr> </ItemTemplate>
I'm working on an ASP.NET project in which the vast majority of the forms are generated dynamically at run time (form definitions are stored in a DB for customizability). Therefore, I have to dynamically create and add my controls to the Page every time OnLoad fires, regardless of IsPostBack. This has been working just fine and .NET takes care of managing ViewState for these controls.
//1. call service layer to retrieve form definition //2. create and add controls to page container }
I have a new requirement in which if a user clicks on a given button (this button is created at design time) the page should be re-rendered in a slightly different way. So in addition to the code that executes in OnLoad (i.e. RenderDynamicControls()), I have this code:
My question is, is this really the only way to accomplish what I'm after? It seems beyond hacky to effectively render the form twice simply to respond to a button click. I gather from my research that this is simply how the page-lifecycle works in ASP.NET: Namely, that OnLoad must fire on every Postback before child events are invoked. Still, it's worthwhile to check with the SO community before having to drink the kool-aid.
On a related note, once I get this feature completed, I'm planning on throwing an UpdatePanel on the page to perform the page updates via Ajax.
I'm working with dynamic fields in ASP.NET due to a very specifc and rigid end-user requirement that would take 2 hours just to explain. Suffice it to say, I can't make the requirement go away.
Anyway, I have a working solution in place; no problems with controls loading, rendering or maintaining their ViewState. This is what my OnLoad looks like:
I'm creating a page that users can upload a file to the webserver. After upload the page will then have a link to the file that has just been uploaded, along with any other files that have already been uploaded.As I am programatcially creating links to the files which have been uploaded, I have to do this in page_init or else the link button won't fire off it's event when clicked. MY web page does all this - it creates the link buttons and when I click on them, it calls the event method required i.e. a sub to download the file.
OK, the problem I've come accross is: when I click upload (to upload the file) - the page_init sub is called, displaying all the previously uploaded files as link buttons. Then my btnUpload_click sub is called, which uploads my current file. The only prob is the current file hasn't been displayed? I can only display links in the page_init, but because btnUpload is called after the page_init, the current file isn't uploaded until after page_init and therefore not dislayed?
I would like to create an attribute I can decorate specific fields or properties with. This attribute will throw an exception if the field or property it decorates is null at a given point in an ASP.Net page lifecycle. I.E. if a property, "x", is null at the prerender stage of an ASP.Net page, it will cause a "ArgumentNullException" exception to be throw with a nice message. Or a mean message. Either way, a message of my choosing.
Is this possible with standard .Net attributes, or would some kind of Spring.Net magic be required?
I have a user control embedded in a web part. It has the following snippets of code:
[code]....
Why are some controls initialised and others not? How do I get around this if I'd like to update the Text property on currentPageLabel?
Update:
I've placed breakpoints all the way through the page life cycle and found that nextButton and currentPageLabel are never initialised. The breakpoints were placed at OnLoad, CreateChildControls, goButton_Click, OnPreRender, Render and OnUnload.
I would like to wrap Session variables in a manner similar to that discussed on CodeProject.
[code]....
Here is my question: if I have to access CurrentUser multiple times in the same page, would I get a performance improvement by assigning it to a local variable instead of accessing the wrapping property? Or does the HttpSessionState make sure the object is only deserialized once per request, so that subsequent calls in the same http request don't cost any more?
I need to capture the amount of time that ASP.net takes to execute each page request in my application, but I need to exclude any network latency. I am currently capturing render times by using the StopWatch class and starting the stopwatch during the OnInit method of the page lifecycle and stopping it after the Unload method completes. It seems that the Unload method includes the time it takes send the request to the client, thus including any internet/network latency. What is the last possible point I could stop the stopwatch in the Page Life Cycle that would not include the time it takes to send the request to the client. Would it be directly before the Unload event?
Related question: Does ASP.net finish building the response before it starts sending to the client? Or does it start sending asynchronously, while the response is being formed?
I am using ASP.Net 2.0 with IIS 5 currently.
I have this code in a class that all of my pages inherit from:
I tried capturing the execution time at the end of the OnRender method, at the start of the OnUnload method and at the end of the OnUnload method. In all three cases the difference in times was at most 1 millisecond. Even when testing this from a client in Europe to a server in the USA, the times were identical.
I have a page on which everything is loaded dynamically.
There is a Gridview (AutoGenerateColumns=true) and in the RowDataBound I check every column for a boolean datatype. If found I add a checkbox (autopostback=true) to the cell and register the CheckedChanged event. The problem is, that I only get the CheckedChanged event, if I reload the grid in Page_Load:
<asp:Content ID="TitleContent1" ContentPlaceHolderID="PageTitlePlaceHolder" runat="Server"> My Page </asp:Content>
This works by placing the content page specific title on the page ("My Page" in this example). Now I want to add a global prefix to the title in my master page for the site name. So I want:
I am using Master page and Content page combination.But how can i access <body> tag and it's event (onload, onunload) of Master page in .aspx page that is not a content page.
I have a master page homeMaster.aspx and many content pages. However the situation is I have few .html pages. Now when a user clicks on a link the html page should get loaded.inside the master page. The problem is these are .html and not content page with .aspx.
I've encountered a problem when I put a treeview in a page which is using master page. The treeview style doesn't apply.For example, I set the nodes with different colors in different levels. But the treeview nodes are still displayed in the default color(bule).
The treeview code is :
[Code]....
If I use these code in a page which doesn't use a master page. The nodes are shown in colors.
Per different user mode, some pages should not be accessible by users unless they have a valid session key.In your opinions -- would it be better to have a list of acceptable pages in the master page, and check if the current page is valid for the current user? Or handle this on every child page?I'm thinking master page, just want to hear what your input would be.
I wrote a page Page method in my aspx page. in web service method I need to call FindControl method return textbox and get text box value. But my findControl will take MasterPage object to iterate.
code.<script type = "text/javascript"> function ShowCurrentDateTime() { $.ajax({ [code]....
But I am getting compiler error when use Page.Master: Reference to non-shared member requires an object reference
How to pass Master Page object or Page to Page method?. So I can use in Sared method.Is there any way I can access Textbox value directly in Page method? I need access couple of controls in Page Method.
How can I use double buffering in asp.net C#?I want smthng like that : I dont want full page refresh when I click a button in a web page.. I think it can be solved with double buffering. When a button clicked for redirect a content page (button-in master page), current page will not go until the redirected page completely load in the background..
I am wondering if there is anyway to grab the html that is generated from an ASP page.I am trying to pull a table from the page,and I foolishly used a static html page so I would not have to be constantly querying the server where this page resides while I tested out my code.The javascript code I wrote to grab to unlabeled table from the page works.Then when I put it into practice with the real page and found that the ASP page does not generate a viewable page with a jquery .get request on the URL.
Is there any way to query the page for the table I need so that the ASP page returns a valid page on request?(I am also limited to using javascript and perl for this,the server where this will reside will not run php and I have no desire to learn ASP.NET to solve this by adding to the issue of proprietary software)
In building custom controls, I've seen two patterns for using the viewstate. One is to use properties to disguise the viewstate access as persistent data.
public bool AllowStuff { get { return (ViewState[constKeyAllowStuff] != null) ? (bool)ViewState[constKeyAllowStuff] : false; } set { ViewState[constKeyAllowStuff] = value; } }
The other is to use private member fields and to override the Load/SaveViewState methods on the control and handle it all explicitly:
(I cut out a lot of safety checking for clarity, so just ignore that.) Is there are particular advantage to one method over the other? I can't see how they'd differ much performance wise. Version 1 is lazy, so I guess you save a bit if you don't need that particular value during a pass. Version 1 is also more abstract, hides the details better. Version 2 is clearer about when the data is actually valid and ok to read or modify (between the load and save) because it more clearly works within the ASP.NET lifecycle. Version 2 does tend to require more boilerplate code though (a property, a backing private field, and viewstate handling in two places) as opposed to Version 1 which combines all that into one place.
I am a bit confused about these two sequence of events or processes happening in conjunction to each other. Does the page handler executes first or does the somepage.aspx get execute first or do they happen simultaneously?