Output Cache With Usercontrol on Masterpage and Multiple VaryByCustom

 

Hey All,

Had an issue today where I had a masterpage which was inherited from 2 pages. On the masterpage I had a control which is using output cache to cache the control. But ran into an issue where you would visit the first page say Test.aspx and you would see the control as expected, but then visit Test2.aspx and you get the same instance of the cached control from the first page. To get around this I made use of varybycustom in the controls output cache directive.

Firstly in your global.asax add a GetVaryByCustomString override:


Public Overrides Function GetVaryByCustomString(ByVal context As System.Web.HttpContext, ByVal custom As String) As String
        Dim val = String.Empty 

        Select Case custom.ToUpper()
            Case "PAGENAME"
                val = context.Request.Path.ToString()
        End Select 

        Return val
    End Function


Then modify your output cache directive to make use of this like so:

<%@ OutputCache VaryByCustom="PageName" Duration="86400" %>

As you can see now the control will be varied by a custom string, the GetVaryByCustom override does this by checking the command argument and depending on what it is returning a value, in this case we are only using PageName but in my main app I have many things in here such as UserID etc etc. Now if you visit page 1 then page 2 you will see you have 2 seperate instances of the cached control on the pages.


Multiple VaryByCustom:

Another thing I wanted to do was have multiple VaryByCustom parametres, I decided to just use the same style as the other varyby strings and seperate the keys with a ;, I then just changed the GetVaryByCustomString to allow for this, something like this seems to do the trick:

Public Overrides Function GetVaryByCustomString(ByVal context As System.Web.HttpContext, ByVal custom As String) As String
        Dim keys() As String = custom.Split(";"c)
        Dim val As String = String.Empty

        For Each key As String In keys
            Select Case key
                Case "PageName"
                    val &= context.Request.Path.ToString()
                Case "UserID"
                    val &= "1"
                Case "CurrentDate"
                    val &= DateTime.Now.ToString()
            End Select
        Next

        Return val
End Function

Now you can use a VaryByCustom string like so:

<%@ OutputCache Duration="3600" VaryByCustom="UserID;PageName" %>



Hope you find that useful.


Thanks
Stefan



 

2 Comments

Comments have been disabled for this content.