How to programmatically add onLoad and onUnload handlers to BODY tag in ASP.NET 2.0

Discussion in 'ASP .Net' started by ~~~ .NET Ed ~~~, Mar 19, 2007.

  1. Well the subject says it all but I am going to elaborate a bit.

    As we all now since 2.0 it is possible to access the Header from code behind
    without much wizardry and that is a good thing.

    Now, in my site I am using master pages and one of the site pages (but could
    be more) needs certain customization in which the BODY tag needs the onLoad
    and onUnload events added to it:

    [body onload="load()" onunload="GEUnload()"]

    I don't want to add that to the master page because of just a few pages. I
    would like to be able to do that programmatically without having to create a
    shadow master page that would have these attributes.

    I tried putting the id and runat attributes to the BODY tag on the master
    page but that did not work out because ASP.NET changes the ID of BODY to
    something like ct100_body rather than the one I gave.

    Can anybody point me to a good solution?
     
    ~~~ .NET Ed ~~~, Mar 19, 2007
    #1
    1. Advertisements

  2. ~~~ .NET Ed ~~~

    Riki Guest

    In that case, use YourBodyID.ClientID instead of YourBodyID.
     
    Riki, Mar 19, 2007
    #2
    1. Advertisements

  3. Remember that my body ID is "Body" and that ASP.NET converts it to something
    like "ctl100_Body" which may change. I tried using FindControl("Body") but
    returns null so I can't find the server control and since I don't have that
    I don't have any object to use the ClientID property on.
     
    ~~~ .NET Ed ~~~, Mar 19, 2007
    #3
  4. ~~~ .NET Ed ~~~

    Riki Guest

    So you're trying to access it from within the page, not from within the
    master page?

    Try this (I'm using VB.NET):

    CType(Page.Master,MyMasterClassName).Body.ClientID

    Replace MyMasterClassName with the real class name of your master page.
    Don't use quotes.

    However, it's a bad idea to try to access the master from within the page.
    It's against OOP principles (code in the page should not depend on code in
    the master).

    Maybe you can achieve what you want with the
    RegisterClientStartupScript method?

    --

    Riki

     
    Riki, Mar 19, 2007
    #4
  5. That is right, on my page's OnPreRender method I tried to do those things
    without success.

    I managed to derive the right control name given by ASP.NET using the
    following:

    private string DeriveClientID(string programmaticId, HtmlHead head)
    {
    string ctlPrefix = head.ClientID.Replace(head.ID, "");
    return string.Format("{0}{1}", ctlPrefix, programmaticId);
    }

    so if my HEAD server element (accessed in ASP.NET 2.0 with the Header
    property of the page) has ID="Head1" and ClientID="ctl00_Head1" then that
    means that if I set BODY id="Body" using this method would return me
    "ctl00_Body" as the client ID which in theory I could have used to find the
    right control.

    The problem is.... even when you use FindControl on the page with the
    correct ID string (ctl00_Body) that appears rendered on the page, it would
    still not find the control.

    Control body = FindControl(DeriveClientID("Body", Header));

    would still return body == null even when the ID is the correct one. As it
    appears the HEADER is ultra special because if you use the id and runat on
    the BODY tag it would still not be accessible by the page.

    For curiosity I put the BODY tag within the hierarchy of the FORM tag on the
    asp.net page but the results where the same, it still cannot find the
    control.

    Also tried as someone suggested, by registering a client script block that
    would set the window.onload and window.onunload to set the functions to be
    called but that does not work either.

    Any other ideas?


     
    ~~~ .NET Ed ~~~, Mar 19, 2007
    #5
  6. Hi,

    I had the same problem, don't know whether you've solved it now but here's the code that did it for me (ps remember to add <body runat="server" ID="masterBody"> to the master page body element.
    This code should go in the OnLoad method of your content page.

    Dim control As System.Web.UI.HtmlControls.HtmlGenericControl = Page.Master.FindControl("masterBody")

    control.Attributes.Item("onload") = "javascript: LoadForm();"

    Hope this helps

    EggHeadCafe.com - .NET Developer Portal of Choice
    http://www.eggheadcafe.com
     
    David Wainwright, Mar 27, 2007
    #6
    1. Advertisements

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments (here). After that, you can post your question and our members will help you out.