Preface
The Do’s + Don’ts of the Advertising SDK say “DO plan for times when no ads are available.” The links of that item leads to the ErrorCode
enumeration and a rudimentarily error handling sample, writing text to debug output.
In this post, I will show an error handling where the AdControl
is replaced by a TextBlock
when an error occurs. Of course, this is still not a high sophisticated error handling. But it might give an idea what to do when no ad is available.
Ian Ferreira suggests in his blog post Keep Users First By Using These Resources For Ad Control Error Handling to hard code a house ad into the real-estate where an ad will appear.
Error Handling by Convention
The error handling is based on naming conventions. What it does is looking for a TextBlock
having a name matching the naming pattern.
Following the convention, the name of the TextBlock
has to be the name of the AdControl
to be replaced, extended by ErrorTextBlock.
Sample: The name of the AdControl
receiving an error is AdControlBottom. According to the naming convention, the name of the TextBlock
to handle the error is AdControlBottomErrorTextBlock.
This makes it easy to implement a search for the correct replacement control. No additional properties need to be defined for the AdControl
. And it follows MVC’s “Convention instead of Configuration” approach.
When an error occurs, the AdControl
is made invisible, while the TextBlock
at the same position will become visible. To make sure the design of the page does not change, the control that replaces the AdControl
must have the same size as the AdControl
.
In the sample app, just the name of the error-causing control, the reason, and the error text is displayed, no matter what the error code is. In real world scenarios, one should handle different errors differently. For example, just because an ad cannot be refreshed, I would not replace the existing one.
Here is how the handler is implemented:
protected virtual void OnAdControlErrorOccurred ( object sender, AdErrorEventArgs args ) { AdControl adControl = sender as AdControl; // If event is not thrown by an Ad Control, do nothing if (adControl == null) { return; } // Just write out an error message. Debug.WriteLine("AdControl error (" + adControl.Name + "): " + args.Error + " ErrorCode: " + args.ErrorCode.ToString()); // Replace adControl by TextBlock showing error message. // Find the TextBlock by naming conventions. // The name of the TextBlock is the name of the AdControl plus "ErrorTextBlock". TextBlock textBlock = FindName( String.Format("{0}ErrorTextBlock", adControl.Name)) as TextBlock; if (textBlock == null) { return; } // Hide the AdControl adControl.Visibility = Visibility.Collapsed; // Show the TextBlock and copy properties. textBlock.Visibility = Visibility.Visible; textBlock.Height = adControl.Height; textBlock.Width = adControl.Width; // Set some text. textBlock.Text = String.Format("Sorry!{0}" + "Can't show AdControl '{1}'.{0}{0}ErrorCode: {2}{0}{0}ErrorMessage: {3}", Environment.NewLine, adControl.Name, args.ErrorCode, args.Error.Message); }
Please have a look at the sample code to see the XAML implementation. You can look at SubPages/SamplePage300x250.xaml, SubPages/SamplePage300x600.xaml
, or SubPages/ SamplePageMultiple.xaml
.
Sample Code
The sample code is part of the post Configure Microsoft Advertising Services’ AdControl using XAML/C#.