Per Ian’s suggestion, I’ve updated the MySite Redirect solution (CodePlex) to support the Force=True parameter passed by the “My Settings” link.
I was curious how the default control handled this case, so I went hunting. The delegate control is added in the MySite farm feature (which also adds the controls for “My Site” and “My Links” to delegates GlobalSiteLink1 and 2, respectively) via _controltemplates/mysiteredirection.ascx, which loads Microsoft.SharePoint.Portal.WebControls.MySiteRedirectionUserControl. The redirect logic of the control is obfuscated, but I still got something for my effort:
public void OnFormInit(object objOfInterest)
{
SPListItem user = objOfInterest as SPListItem;
if (user != null)
{
this.RedirectIfNecessary(user);
}
}
It had never occurred to me that objOfInterest might actually be of interest, but it turns out to be an item from the internal users list (_catalogs/users). As much fun as it was to go hunting for the account in the control tree, I prefer the performance of a simple cast:
public void OnFormInit(object objOfInterest)
{
var user = objOfInterest as SPListItem;
if(user != null)
RedirectIfNecessary(user[SPBuiltInFieldId.Name] as string);
}
I also changed ServerContext.Default to ServerContext.Current, which is shared across an HttpContext. The revised redirect logic is pretty clean:
protected void RedirectIfNecessary(string user)
{
try
{
if (string.IsNullOrEmpty(user))
return;
bool force = false;
if (bool.TryParse(Request.QueryString["Force"], out force) && force)
return;
var sc = ServerContext.Current;
if (sc == null)
return;
var mgr = new UserProfileManager(sc);
if (mgr != null && mgr.UserExists(user))
Response.Redirect(mgr.MySiteHostUrl.Trim('/') +
"/Person.aspx?accountname=" + user);
}
catch (SPException) { }
}
Update 3/27/2009: Updated Source v0.3
- Get username from Account field (Name site column) instead of Title
- Quit early if user is empty

