Page_PreRender and Global.asax - asp.net

I want to bind to the Page PreRender method on at the global.asax level, but for some reason the method is never getting called. My method looks like:
protected void Page_PreRender(object source, EventArgs e)
{
/* do stuff */
}
Am I able to call Page events like this in Global.asax?

The global.asax is derived from HttpApplication class and not contain the Page_PreRender event as you can see on the MSDN reference:
http://msdn.microsoft.com/en-us/library/system.web.httpapplication(VS.90).aspx
If you want to globally capture the PreRender event you can make a different base class for the System.Web.UI.Page, overwrite this event, and use this class to your pages.
For example
public abstract class BasePage : System.Web.UI.Page
{
protected override void OnPreRender(EventArgs e)
{
base.OnPreRender(e);
}
}
and use the BasePage on your pages

Related

Initialize variables before having anyone enter the web app

How can I initialize variables before my Web Application starts? I want to have, for example an Application type, to count number of logged in users in my website (it's an example, I have more variables that need initialization). How can I perform that?
It could be very useful if there was some event that would be called at the start of the Web App. I thought that I could check in each Page_Load event if a certain Session called, e.g Session["Started"] is null, and if it, redirect to an .aspx page for initialization. Or, even better, have a class called, e.g MyPage which inherits from System.Web.UI.Page and have her constructor get a function as an argument, which will be called after the initialization of the base class Page_Load.
Maybe I'm just bothering, is there any built-in event called that I can overwrite to initialize everything I want in the beginning?
You can use the Global.asax file for this. In particular you can use the Application_Start, Session_Start, Session_End events.
public class Global : System.Web.HttpApplication
{
protected void Application_Start(object sender, EventArgs e)
{
}
protected void Session_Start(object sender, EventArgs e)
{
}
protected void Session_End(object sender, EventArgs e)
{
}
}
Here for more informations.

How to use Load and Unload events in a user web control?

I swear to god I tried googling it.
I have a webcontrol that logs into the database the time and date of a page load, and same of page unload.
I can't set it up to save my life.
can somebody provide a solution?
Thanks!
You can use UserControl's Load and Unload events.
public partial class WebUserControl1 : System.Web.UI.UserControl
{
protected void Page_Load(object sender, EventArgs e)
{
// Log to Database
}
protected void Page_Unload(object sender, EventArgs e)
{
// Log to Database
}
}
Here is ASP.Net Page Life Cycle
The page fires the load event, which recursively goes through all of its controls, including your user control, to fire that load event on it. same action occurs for Unload. The page controls it all, which is controlled by the module that controls the ASP.NET framework.

Aspx and Ascx lifecycles : avoid multiple select on database

I use an ascx user control for manage CRUD o database entity. I reuse this userc control in my aspx page for show in readonly mode the database data of a record on database. The user control have inside a simple FormView and an objectdatasource.
Now, in a aspx page that contains that ascx i have to know, in DATABIND time of the aspx some data of the record of the database that is considerate by the user control. User control are databind after the aspx page, and for this reason i don't have the data. I have to do a select in aspx page on database and after the user control do the same select.
How can i do for optimize this process?
ASCX base events may be fired after your ASPX's base events, but in the whole lifecycle, you can fire your own events.
You could define an Event on your ASCX, make your page register to this event, and then propagate your custom event from your ASCX to your ASPX, with whatever data you need in the arguments
rough example (may not compile) : in the ASCX
public partial YourControl : System.Web.UI.UserControl {
public event EventHandler MyControlDataBound;
public void FireMyControlDataBound()
{
if (MyControlDataBound!= null)
{
MyControlDataBound(this, new EventArgs());
}
}
protected void MyDataBound(object sender, EventArgs e) {
// ......
FireMyControlDataBound();
}
}
and in the ASPX
public partial class MyPage: Page
{
protected void Page_Load(object sender, EventArgs e)
{
yourUserControlInstance.MyControlDataBound += HandleYourDataInYourPage;
}
protected void HandleYourDataInYourPage(object sender, EventArgs e) {
// .. do whatever needed in your page, with your data
// if you have defined a custom Args class that inherits EventArgs, your could collect data here...
}
}
Feel free to create a class that inherits EventArgs to pass data with your event if you need this
You can pass your arguments to your UserContol in init event of your Page
protected override void OnInit(EventArgs e)
{
base.OnInit(e);
var control = (UserControl)this.FindControl("UserControlId");
control.Property = ...;//Pass User Control properties
}

UserControl has IsPostBack, but Control does not

i'm trying to solve a bug in Visual Studio, the suggestion is to stop using UserControls and use Control instead..
So i'm converting all my UserControl into just Control, e.g.:
public partial class Controls_UserManagement_GroupManager : System.Web.UI.UserControl
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
becomes
public partial class Controls_UserManagement_GroupManager : System.Web.UI.Control
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
Except that there is no Control.IsPostBack?
How do i replace UserControl with Control?
Series
This question is one in the ongoing Stackoverflow series, "Templating user controls":
How to add a Templating to a UserControl?
How to inherit from Control, rather than UserControl?
UserControl has IsPostBack, but Control does not
UserControl does not have public property named ContentTemplate
How do i specify CodeFileBaseClass from web.config?
Control has a Page property, which has an IsPostback property. This should give you the value you need.
public class MyControl : Control{
protected override void OnInit( EventArgs e ){
if( this.Page.IsPostBack ){
// do something
}
}
}
MSDN Reference

Access textbox value in a header in a master page to .aspx.vb page

I created a textbox and a submit button in header(User Control) included in a master page
and I want to use that textbox value after clicking submit in my .aspx.vb page.
How can i access that, as the vb page is loaded first and then master page is loading ?
TextBox Val = (TextBox)this.Master.FindControl("TextBoxID");
The best way to communicate from UserControl to Page/MasterPage is using events
The best way to communicate from MasterPage to Page is using events
On this way you don't hardlink UserControls with their Pages/MasterPages and the Page with it's Master.
Add an event to your UserControl that is raised when the user clicks the button, for example:
In UserControl of type MyControl:
public delegate void SubmittedHandler(MyControl ctrl);
public event SubmittedHandler Submitted;
protected void BtnCLick(object sender, EventArgs e) {
Submitted(this);
}
Then add an handler to this event in your MasterPage, handle it and raise the Master's event again:
In Master's codebehind:
public delegate void MyControlSubmittedHandler(MyControl ctrl);
public event MyControlSubmittedHandler ControlSubmitted;
protected void Page_Init(Object sender, EventArgs e) {
this.MyControl1.Submitted += MyControlSubmitted;
}
protected void MyControlSubmitted(MyControl sender) {
ControlSubmitted(sender);
}
Then add an handler to this event to your page:
In your Page:
protected void Page_Init(object sender, EventArgs e) {
((SiteMaster)Master).ControlSubmitted += MasterControlSubmitted;
}
protected void MasterControlSubmitted(MyControl sender){
// do whatever you need to do
}
If you only need to access the TextBox from the page and you don't need to handle the click-event, you could also use properties to achieve this:
add a public property f.e. MyControlText in your UserControl that get/set the TextBox.Text property
add a public property f.e. MyControlText in your Master that get/set your UserControl's MyControlText property
Now you can get/set this property from your page in this way:
((SiteMaster)Master).MyControlText = "Hello World";

Resources