Brendan Enrick

Daily Software Development

Infinite Loop in a Property

Earlier today I was trying to debug a Stack Overflow Exception I was receiving. While debugging I was stepping into the function where the problem was occurring. I could not seem to find the problem. A line of code was calling a function and passing it a few properties as parameters and the value returned by the function was being stored in another property. Without really paying attention to which properties I was stepping into I just clicked through them and then it would throw the exception. I was quite confused and did not even think that it could be a problem with the properties, because I had stepped through them. Well, I as with many other people are annoyed when I am debugging and it steps into a property with no extra logic. Sometimes when I create a property I remember to add the DebuggerStepThrough property. If you don't know what that is I recommend you learn what it is and use it.

When a property has no extra logic in it I obviously don't care to step through its execution it is not the problem.... except when it is.

Someone added a property to a class recently and remembered to add the DebuggerStepThrough property to it. The problem is that this simple property created an infinite loop, which I did not even think to check because some of the properties I was stepping into. Only one did I not step into and it had the problem. It had the following problem.


private int _x;
[DebuggerStepThrough]
public int X
{
    get
    {
        return _x;
    }
    set
    {
        X = value;
    }
}

When I tried to set the value I jumped into a recursive loop which the debugger stepped through so it did not even let me see the problem when I was trying to debug. Gotta make sure that doesn't happen. Kind of bad when a property calls itself instead of setting the private member it is supposed to access.

Dynamically Register an Asynchronous Postback Control with a ScriptManager

In order to use an update panel you have to specify the triggers either individually or by setting the ChildrenAsTriggers property of the UpdatePanel. Sometimes you may need to set these triggers dynamically such as if the desired trigger is inside of a repeater and is not inside of the update panel. In instances such as this you will need to from the code behind register the control with the script manager. To do this you will want to use the RegisterAsynchPostBackControl function of the ScriptManager in the following manner:

ScriptManager1.RegisterAsyncPostBackControl(Button1);

This code could be inside of the OnItemDataBound event handler for a repeater or even in page load if you want to register it in code. The script manager will now know to hijack the postbacks created by this control and turn them into asynchronous postbacks. The good thing about this is that you will now not do a full postback. The bad part is that you still have to let the update panel know that it needs to update after the asynchronous postback. To do this you will want to Call the Update() method of the UpdatePanel so for example you might do the following:

protected void Button1_Click(object sender, EventArgs e)
{
     // Do work
     UpdatePanel1.Update();
}

By using this method you will not be tied to your .aspx pages. It is not quite as elegant as when you just use the triggers collection in the UpdatePanel on the .aspx page, but this way of doing this is still easy and possible when inside of a template such as in a repeater or a gridview.

Happy AJAXing! 

Accessing a MasterPage ScriptManager from a Content Page

Recently I had forgotten how to access the ScriptManager in my MasterPage from one of the Content Pages. There is a static method on the ScriptManager class called GetCurrent() which will allow access to the current instance of a ScriptManager. This is useful because the ScriptManagerProxy is really just designed to do the declarative work normally performed on the ASP.NET page, but some work needs to be done through code. An example would be to check the ScriptManager instances IsInAsyncPostback property.

if (ScriptManager.GetCurrent().IsInAsyncPostback)

{

    // Perform only in asynchronous postback logic here.

This is very useful and easy, but I seem to always forget it is here. Perhaps now that I have blogged about it I will remember, and if not I can at least come back here to find it. Yes, when I forget I go through the trouble of casting Master as my MasterPage's class and then I access it that way (what a pain).

Visual Studio 2008 JavaScript Intellisense!

For those of you who do not read Scott Guthrie’s Blog, you really should. I know that any time I need to write JavaScript I switch out of Visual Studio, but I will not have to with Visual Studio 2008. It is supposed to have much better support for JavaScript development. Even Intellisense. For anyone interested you should check out this recent blog entry from Scott Guthrie which gives a lot of cool information about Visual Studio 2008’s JavaScript Intellisense.

I can’t wait to start using VS 2008. It has a lot of great features I plan on getting a lot of use out of.

Accessing Master Page Properties from a content page

As I mentioned in my previous blog post about Accessing a property of a base page from a user control, I am going to explain how to access a property on a MasterPage from the content page. One merely has to check the namespace and the class name of the masterpage, which can be found in the code behind file. Just cast the Content Page’s Master as the class of the masterpage file which it uses, and then just access the value. It is really quite simple.

int neededValue = ((MyNameSpace.MyMasterPageClassName)Master).MyProperty;

Using that method you are able to easily access a property of a masterpage file when needed.

Accessing Properties of a Base Page from a User Control

Earlier today I was helping someone who was working with a user control. That control was on an ASP.NET page which was inheriting from a base page. From the user control he could not access the properties of the base page. He mentioned that he was getting an error message which said that the property did not exist in the current context.

I showed him that the reason he was having the problem is because the code in the user control came from the page before, and thus he would need to get the properties from there, but he was also going to need to cast the Page as the base Page in order to get to the property.

int myImportantValue = ((MyBasePage)Page).ImportantProperty;

This will retrieve the value from the property of the base page. It is a fairly simple task. Perhaps next I will show how to do a similar task with a masterpage.

I've now added that blog post about Accessing a Property of a MasterPage from a Content Page

Clearing Page Output Cache Entries

Earlier today I had a situation where I needed to clear the output cache entry of a page. After a quick Google search I turned up Steve Smith’s Article on Removing Page Output Cache Entries.

The article is a short, helpful article which quickly and easily explains how to remove the output cache entry of a page.

private void RemoveButton_Click(object sender, System.EventArgs e)
{
    HttpResponse.RemoveOutputCacheItem("/caching/CacheForever.aspx");
}

I hope everyone else finds this to be easy to understand and implement. The above should work as long as you have a page named “CacheForever.aspx” in the folder “caching” at the root of the site.

Happy Caching!

Simple Lazy Loading

Lately, I’ve noticed a lot of people who are not careful about how they load objects. Managing objects is a fundamentally important part of software development.

Lets say for example I have an integer in the query string, and I need to use this number in a few places on my page. Well it is obviously inefficient and an ugly process to check the query string and parse the value into an integer every time I want to access that number. I could also at the beginning just grab the number, but this would become a problem if I rearranged things. There is also a chance the execution will not require even checking the query string, and then I will have loaded that value for no reason.

This is a very simple and easy way of retrieving an number from a query string.

private int _pageId = 0;
private int PageId
{
    get
    {
        if (_pageId == 0)
        {
            int myInt;
            int.TryParse(Request.QueryString[”pageId”], out myInt);
            _pageId = myInt;
        }
        return _pageId;
    }
}

With this I no longer have to parse the query string or have the ugly Request.QueryString all through my code. One nice thing is that once I have successfully loaded a valid pageId it will not reference the query string again. As you can probably see this is also helpful when making a database call or any other time consuming work to get some data.

This is very useful for more complex data structures. When the object being loaded is large we want to avoid loading it if we do not have to and also loading it more than once. This is what we can achieve here. In that case you would compare the value to null instead of 0. This will let you know if it has yet been loaded.

Simple CMS Plug-in for ASP.NET Update Released

Yesterday, I updated my SimpleCMS plug-in for ASP.NET. It is a free CMS designed to be different from most content management systems. It is not supposed to include tons of features and be some bloated system. It is designed to be an add-on for an existing site.

Check it out. It is free at ASPAlliance.com. This new release uses the RTM builds of the MS AJAX Library and the AJAX Control Toolkit.

If this sounds like something you might be interested in, then check it out. Let me know how you like it and any suggestions you have for it. Just don't ask for it to become like the huge content management systems. There are plenty of those out there give one of those a shot if that is what you are looking for.

Five Things you did not know about me

Like everyone else, I’ve now been tagged into this game. Steve Smith tagged me so now I will tell you five things about me that you may not know.

1. I have lived in one city my entire life. I’ve been living in Kent, Ohio since I was born, and I have yet to move elsewhere. I’ve lived in 3 homes in Kent. I am currently attending Kent State University, so am still not out of Kent. Not sure when I will leave Kent, but I doubt I will be living here for too many more years.

2. I’ve been a world traveler since I was 10 years old. This is when my family started going on trips. Though my travels have been much more extensive than most people of my age, I have not seen nearly everything I wish to in my life. I have been to Venezuela twice, most islands in the Caribbean, Mexico a few times, Canada more times than I can remember, Hawaii once, England twice, France twice, Corsica once, once to Italy, once to Spain, and I’ve probably forgotten something. Sadly I have not yet been to Germany. I wish to see much more though, and hope to see many places in Africa, Asia, and Australia.

3. I, like Steve Smith, am a gamer. As can be seen by the title of my blog I am obviously some type of a gamer. I enjoy playing Dungeons and Dragons. Yes, I am aware that it is the stereotypical nerd game. It is not the only game that I play though. I enjoy making up my own games. These games have their own worlds and own systems for play. I enjoy playing them a great deal. I also enjoy playing card games, board games, and video games. Most of my games are console games, but I also play a lot of PC games. The board games I play are classics as well as lesser known games. One of my favorites since I was a child is called Solarquest.

4. After number 3 this one becomes more obvious. I would like to eventually work in some type of game design. I think it would be great fun. I might be able to get into video game development with help from the degree in Computer Science I am about to earn from Kent State University. I know many people who would like to work on games. This semester I will be taking a class about designing and building game engines. I hope it is a fun class.

5. Most people don’t know that while I think this five things idea is kind of cool. I have this notion that I am merely propagating a chain letter farther along. I don’t know if others have gotten this same feeling, but it would seem to me that this, while interesting, at its roots is an attempt to see how far the chain lett……. the five things blog will go.

So now I must search for bloggers who have yet to list five things or be tagged. Such a cruel fate. Here is a group of people I have yet to see five things from, and whom I know little about. I apologize in advance if these people have been tagged already or do not want to play the game.

Alessandro Gallo ( Garbin )
Joydip Kanjilal
Ian Lipsky
David Walker
Mo Meng