Never use a MultiView inside a Repeater

Published:

...Unless you want a ViewState larger than the rest of your page

First off, without the help of Fritz Onion's ViewStateDecoder, my life would have been messed up a lot longer than it was tonight, as I was searching for a reason to explain a 60K ViewState embedded in a page.

I meticulously turned off the ViewState in every server control that did not need it with no apparent effect on the ViewState size.

Googling, I came upon Frtiz's ViewState tool, which allows you to see the contents of the ViewState.  The utility actually has quite a few nice features, such as the ability to pull ViewState out of any published page -- directly.

What the tool showed me was that a lot of what I was seeing in the page was actually the ControlState, not the ViewState.  Of course, it all looks the same when you see it in the page, but there is an big difference between the two.

ControlState is something you can't turn off.  It is a control's fail-safe way of being able to save state information, just in case ViewState is disabled in the page.

So I traced almost the entire bulk of ViewState in the page to 3 MultiView controls that were sitting inside templates  of a Repeater control.  I could disable ViewState for the entire page, and it still couldn't touch that ControlState.

Who designs these things?

Anyway, I came up with a solution that allows me to keep the MultiViews, and even leave them inside the repeater.

I built a very simple MultiViewLite control, which is inherited from the MultiView, and disables the ControlView.  When I was finished, I just replaced <asp:Multiview... with <MyControls:MultiviewLite... and everything worked perfectly!

The complete code code listing for the MultiViewLite control can be found below.  It has the identical functionality of the standard MultiView control, with the exception that both ControlState and ViewState are disabled.

MutliViewLite.vb

Public Class MultiViewLite : Inherits MultiView

    Protected Overrides Function SaveControlState() As Object
       
Return Nothing
   
End Function

    Protected Sub Control_Init(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Init
       
Me.EnableViewState = False
    End Sub

End Class

 

Entry #6

Comments

This Blog entry currently has no comments.

Post a Comment

Please Log In

To use this feature you must be logged into your Lottery Post account.

Not a member yet?

If you don't yet have a Lottery Post account, it's simple and free to create one! Just tap the Register button and after a quick process you'll be part of our lottery community.

Register