tags:

views:

284

answers:

2

Hello everyone,

I'm using an update panel to have part of my page updating asynchronously and it's navigation needs to be registered when a Multiview changes its activeindex.

For sample, when the page first loads, the Multiview Active Index = 0. When user clicks on a link, I show the content of the View index 1.

It is really important allowing the user go back/forward using the browser history.

The scriptmanager is located in a masterpage and has its "EnableHistory" property set to "True".

Has someone implemented it when working with Multiview?

Thank you,

Josimari Martarelli

A: 

I think this should work, but you'll need to customize it a bit. I'm doing something very similar, but I had to move away from using the multview within updatepanel due to a problem with a third-party control I had embedded within it.

You'll need to add a reference to your Master page in your aspx file using the asp.net tag below. And also, expose the scriptmanager as a public control in your master page so you can wire an event to it.

In your page's design/html code: Update the virtual path to your Master or use the Type to assign the type reference.

<%@ MasterType VirtualPath="~/MasterPage.master" %>

In your page's init event:

   public void Page_Init(object sender, EventArgs e)
    {   // can be done at MasterPage level if you like
        this.Master.ScriptManager.EnableHistory = true;
    }

Then in your page's load event:

protected void Page_Load(object sender, EventArgs e)
    {              
        this.Master.ScriptManager.Navigate += 
         new EventHandler<HistoryEventArgs>(ScriptManager_Navigate);

        if (!this.IsPostBack && 
              !ScriptManager.GetCurrent(this).IsInAsyncPostBack)
        {
           // load default multiview index
        }           
    }

Then add this new event handler to your page. This names the item "myArgs", you should use something a bit more intuitive for your content. In my implementation, I have a series of items (like sort order, page index, etc. separated by delims and then break them up and assign them).

 protected void ScriptManager_Navigate(object sender, HistoryEventArgs e)
    {
        if (!string.IsNullOrEmpty(e.State["myArgs"]))
        {
            string args = e.State["myArgs"];
            SetMyArgs(args);                           
        }
        else
        {
            // just load default
        }
    }

The args will be the multiview index. These are just helper functions that I use. If index is the only item you care about, then you can just inline these calls to the main methods.

 private void SetMyArgs(string args)
    {
       int myIndex = int.Parse(args);
      // set multiview index here?
    }

    private string GetMyArgs()
    {       
        return myMultiview.ActiveIndex.ToString();
    }

Then when you trigger the event that changes the active index, add this to those methods

  if (this.IsAsync)
    {
        this.Master.ScriptManager.AddHistoryPoint("myArgs", GetMyArgs());
    }

Hopefully, this gives you some help.

Jim W
Hi Jim,Thank you very much, it is now working the way it should!Josi
A: 

Thank you, it works perfectly...