<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Nephandus &#187; viewstate</title>
	<atom:link href="http://www.nephandus.com/tag/viewstate/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.nephandus.com</link>
	<description>Just another WordPress weblog</description>
	<lastBuildDate>Tue, 03 Jan 2012 16:33:48 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Break On Through To The Other Side</title>
		<link>http://www.nephandus.com/2010/07/02/break-on-through-to-the-other-side/</link>
		<comments>http://www.nephandus.com/2010/07/02/break-on-through-to-the-other-side/#comments</comments>
		<pubDate>Fri, 02 Jul 2010 19:23:23 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[c#]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[user controls]]></category>
		<category><![CDATA[viewstate]]></category>

		<guid isPermaLink="false">http://www.nephandus.com/?p=26</guid>
		<description><![CDATA[User controls are the source of a lot of headaches in C#. They have two major issues that tend to drive programmers a little mad. The first is that they don&#8217;t play nicely with the ViewState. Particularly once users start to nest and reorder user controls, the ViewState model (much of which is based on [...]]]></description>
			<content:encoded><![CDATA[<p>User controls are the source of a lot of headaches in C#.  They have two major issues that tend to drive programmers a little mad.  The first is that they don&#8217;t play nicely with the ViewState.  Particularly once users start to nest and reorder user controls, the ViewState model (much of which is based on position within the page) starts to break down.  In many cases programmers circumvent this little nightmare by simply disabling the ViewState on some controls.</p>
<p>The second issue is that user controls are in their own scope and don&#8217;t have immediate access to the rest of the page.  That is both a blessing and a curse; good control design means that the controls should be fairly independent of each other but a more pragmatic developer will also note that user controls exist primarily so that numerous copies of the same thing can be easily created and that making entirely self contained controls leads to a lot of unnecessary duplication.</p>
<p>Fortunately there are workarounds for both of these issues.  <span id="more-26"></span></p>
<p>Regardless of view state, a user control can pass information and therefore trigger events properly using the ASP framework by means of some elaborate JavaScript trickery.  In this example, I am using JQuery and JavaScript to allow a click event inside a ViewStateless user control to set the value of a text box and click a button outside of the control, thereby triggering an event within the ASP framework.</p>
<pre class="brush: jscript; title: ;">
$(JQueryObjectForMyUserControl).find(&quot;.clickableElement&quot;)
.unbind(&quot;click&quot;).click(function() {
        var clickHandler = $(this).parents(&quot;.OuterBound&quot;).find(&quot;.ClickHandler&quot;);
        //I'm replacing the underscores with dollar signs here because that is what ASP expects to find internally
        var argument = $(this).find(&quot;a&quot;).attr(&quot;id&quot;).replace(/_/g, &quot;$&quot;);
        clickHandler.find(&quot;.ClickHandlerArgument&quot;).val(argument);
        clickHandler.find(&quot;.ClickHandlerLinkButton&quot;).click();
    });
</pre>
<p>Getting around the scope restriction requires a great deal less insanity.  For example, my user controls have to be able to activate a modal overlay and dialog box.  I could put the code for that inside each user control but that would be a lot of code bloat.  Instead, I have the dialog in one place on my page and allow the controls to set its values and activate it.</p>
<pre class="brush: csharp; title: ;">
Page page = this.Page;
ModalPopupExtender ModalPopupExtenderLockedDialog = (ModalPopupExtender)page.FindControl(&quot;ModalPopupExtenderLockedDialog&quot;);
Label LabelMessage = (Label)page.FindControl(&quot;LabelMessage&quot;);
ModalPopupExtenderLockedDialog.Show();
LabelMessage.Text = &quot;Hello World!&quot;;
</pre>
<p>Getting to properties is only a little harder.  If you need to get to the properties of your page you need only cast this.Page appropriately.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nephandus.com/2010/07/02/break-on-through-to-the-other-side/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>C# WebControl Behavior</title>
		<link>http://www.nephandus.com/2010/04/26/c-webcontrol-behavior/</link>
		<comments>http://www.nephandus.com/2010/04/26/c-webcontrol-behavior/#comments</comments>
		<pubDate>Mon, 26 Apr 2010 18:52:36 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[c#]]></category>
		<category><![CDATA[serialization]]></category>
		<category><![CDATA[serialized]]></category>
		<category><![CDATA[session]]></category>
		<category><![CDATA[viewstate]]></category>
		<category><![CDATA[webcontrol]]></category>

		<guid isPermaLink="false">http://www.nephandus.com/?p=14</guid>
		<description><![CDATA[My &#8220;learn C# project&#8221; at work has centered around creating a drag-and-drop portlet style system for the display of custom widgets.  I&#8217;ve been using JQuery UI for the javascript functionality but the backend has been all custom C# work. People familiar with C# know that C# supports the inclusion of user defined controls called WebControls.  [...]]]></description>
			<content:encoded><![CDATA[<p>My &#8220;learn C# project&#8221; at work has centered around creating a drag-and-drop portlet style system for the display of custom widgets.  I&#8217;ve been using JQuery UI for the javascript functionality but the backend has been all custom C# work.</p>
<p>People familiar with C# know that C# supports the inclusion of user defined controls called WebControls.  These are more or less very simple C# programs which can be man-handled by another bit of C# code.  They&#8217;re handy for making your code modular: you might design a web-control that takes and validates a credit card number, for example.</p>
<p>But WebControls are notoriously tricky beasts and over the course of the last few weeks I&#8217;ve come to understand that one of the reasons for this is that they don&#8217;t behave quite the way you might expect them to when they are serialized and deserialized.<span id="more-14"></span></p>
<p>Most C# serialization occurs behind the scenes in something called the ViewState.  For those of you who have no idea what that means, ViewState is C#&#8217;s rather clever way of persisting the things on a webpage so that it feels a little more like a desktop application.  The long and the short of its behavior is that things get serialized into the ViewState just before rendering and de-serialized back out of ViewState on the next request as part of the load step.</p>
<p>Most controls go into the ViewState&#8230; but WebControls don&#8217;t.  At least, they don&#8217;t go in there by default.  Presumably you can create custom ViewState serialization for them; I have not tried this.  Instead, I serialized my WebControls very simply into Session and coded that storage into a property.  My code looked something like this</p>
<pre class="brush: csharp; title: ;">
private Widget InternalWidget
{
	get
	{
		Widget result;
		if (Session[&quot;Widget&quot; + this.UniqueID] != null)
		{
			result = Session[&quot;Widget&quot; + this.UniqueID] as Widget;
			if (result == null )
			{
				result = WidgetFactory.Create();
				result.Arguments = InternalActivePortlet.Arguments;
			}
		}
		return result;
	}
	set
	{
		Session[&quot;Widget&quot; + this.UniqueID] = value;
	}
}
</pre>
<p>Now, as expected, none of my EventHandlers persisted when the WebControl came back out of its session serialization.  The object that comes back from serialization is an entirely new object; the old one has been destroyed.  As a result, the event handlers in the deserialized object point to null function pointers.  C# doesn&#8217;t throw an error when you call a null function pointer, however; it just goes on its merry way and does nothing.</p>
<p>But the function pointers &#8211; even though they now point to null objects &#8211; remain.  C# remembers a great deal more about the session-serialized object than one might think including &#8211; and this is the part that really threw me &#8211; the fact that it&#8217;s already been through the ASP parser.</p>
<p>I had expected, since my event handlers weren&#8217;t working when the WebControl came back from Session, that the events themselves were gone and that therefore the object returned from session was new &#8212; as if it was programatically created for the first time.  This is not the case.  When you programatically create a WebControl for the first time it&#8217;s ASP file is parsed and event handlers are set up based upon the code there.  When you deserialize a WebControl from session, however, C# remembers that it has already dealt with its ASP code and does not do it a second time.</p>
<p>Consequently, none of the event handlers defined in the ASP work either.</p>
<p>I expect that all of this seems rudimentary to more experienced C# developers, but to me it was quite a mystery and it took me some time to work out the above logic.  Hopefully this will aid some neophyte coder working through the same issues I had.</p>
<p>On a totally unrelated note: I need to find a decent code display plugin for WordPress&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nephandus.com/2010/04/26/c-webcontrol-behavior/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

