<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://weblogs.asp.net/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Development With A Dot</title><link>http://weblogs.asp.net/ricardoperes/default.aspx</link><description>Blog on development in general, and specifically on .NET</description><dc:language>en</dc:language><generator>CommunityServer 2007 SP1 (Build: 20510.895)</generator><item><title>Debugging ADO.NET Data Services</title><link>http://weblogs.asp.net/ricardoperes/archive/2009/11/01/debugging-ado-net-data-services.aspx</link><pubDate>Sun, 01 Nov 2009 18:45:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:7244740</guid><dc:creator>Ricardo Peres</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/ricardoperes/rsscomments.aspx?PostID=7244740</wfw:commentRss><comments>http://weblogs.asp.net/ricardoperes/archive/2009/11/01/debugging-ado-net-data-services.aspx#comments</comments><description>&lt;LINK rel=stylesheet type=text/css href="http://alexgorbatchev.com/pub/sh/2.0.320/styles/shCore.css"&gt;&lt;/LINK&gt;&lt;LINK id=shTheme rel=stylesheet type=text/css href="http://alexgorbatchev.com/pub/sh/2.0.320/styles/shThemeDefault.css"&gt;&lt;/LINK&gt;
&lt;SCRIPT type=text/javascript src="http://alexgorbatchev.com/pub/sh/2.0.320/scripts/shCore.js"&gt;&lt;/SCRIPT&gt;

&lt;SCRIPT type=text/javascript src="http://alexgorbatchev.com/pub/sh/2.0.320/scripts/shBrushCSharp.js"&gt;&lt;/SCRIPT&gt;

&lt;P mce_keep="true"&gt;Debugging ADO.NET Data Services can be tricky, not because of the web service part but because of the underlying persistence layer.&lt;/P&gt;
&lt;P mce_keep="true"&gt;You can include the exception details on the error page&amp;nbsp;by including this on the DataService&amp;lt;T&amp;gt; class declaration:&lt;/P&gt;&lt;PRE class="brush: csharp"&gt;[ServiceBehavior(IncludeExceptionDetailInFaults = true)]
public class MyService: DataService&lt;MYENTITIES&gt;
&lt;/PRE&gt;
&lt;P&gt;Also, you can override HandleException method:&lt;/P&gt;
&lt;PRE class="brush: csharp"&gt;protected override void HandleException(HandleExceptionArgs args)
{
base.HandleException(args);
}
&lt;/PRE&gt;
This method is called first when an exception occurs but before it propagates to the point of crashing.

&lt;A class=addthis_button href="http://www.addthis.com/bookmark.php?v=250&amp;amp;pub=xa-4a96c06008dc31e0" mce_href="http://www.addthis.com/bookmark.php?v=250&amp;amp;pub=xa-4a96c06008dc31e0"&gt;&lt;IMG style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; BORDER-TOP: 0px; BORDER-RIGHT: 0px" alt="Bookmark and Share" src="http://s7.addthis.com/static/btn/v2/lg-share-en.gif" width=125 height=16 mce_src="http://s7.addthis.com/static/btn/v2/lg-share-en.gif"&gt;&lt;/A&gt;
&lt;SCRIPT type=text/javascript src="http://s7.addthis.com/js/250/addthis_widget.js?pub=xa-4a96c06008dc31e0" mce_src="http://s7.addthis.com/js/250/addthis_widget.js?pub=xa-4a96c06008dc31e0"&gt;&lt;/SCRIPT&gt;

&lt;SCRIPT type=text/javascript&gt;
SyntaxHighlighter.config.clipboardSwf = 'http://alexgorbatchev.com/pub/sh/2.0.320/scripts/clipboard.swf';
SyntaxHighlighter.brushes.CSharp.aliases = ["c#", "c-sharp", "csharp"];
SyntaxHighlighter.all();
&lt;/SCRIPT&gt;

&lt;SCRIPT type=text/javascript src="http://shots.snap.com/ss/7dcf59af71ae4ef1d02a114a733595f1/snap_shots.js"&gt;&lt;/SCRIPT&gt;
 &lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7244740" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/ricardoperes/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/ricardoperes/archive/tags/ADO.NET+Data+Services/default.aspx">ADO.NET Data Services</category></item><item><title>ADO.NET Data Service Interceptors</title><link>http://weblogs.asp.net/ricardoperes/archive/2009/11/01/ado-net-data-service-interceptors.aspx</link><pubDate>Sun, 01 Nov 2009 18:19:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:7244735</guid><dc:creator>Ricardo Peres</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/ricardoperes/rsscomments.aspx?PostID=7244735</wfw:commentRss><comments>http://weblogs.asp.net/ricardoperes/archive/2009/11/01/ado-net-data-service-interceptors.aspx#comments</comments><description>&lt;LINK rel=stylesheet type=text/css href="http://alexgorbatchev.com/pub/sh/2.0.320/styles/shCore.css"&gt;&lt;/LINK&gt;&lt;LINK id=shTheme rel=stylesheet type=text/css href="http://alexgorbatchev.com/pub/sh/2.0.320/styles/shThemeDefault.css"&gt;&lt;/LINK&gt;
&lt;SCRIPT type=text/javascript src="http://alexgorbatchev.com/pub/sh/2.0.320/scripts/shCore.js"&gt;&lt;/SCRIPT&gt;

&lt;SCRIPT type=text/javascript src="http://alexgorbatchev.com/pub/sh/2.0.320/scripts/shBrushCSharp.js"&gt;&lt;/SCRIPT&gt;

&lt;P mce_keep="true"&gt;There are two possible interceptions you can perform on an ADO.NET Data Service:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;
&lt;DIV mce_keep="true"&gt;Query interception: intercept a query made for an entity in order to enforce a restriction;&lt;/DIV&gt;&lt;/LI&gt;
&lt;LI&gt;
&lt;DIV mce_keep="true"&gt;Change interception: intercept a request for updating an entity and possibly cancel it, or change the entity.&lt;/DIV&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;P mce_keep="true"&gt;Query interceptions are achieved by marking a method with attribute &lt;STRONG&gt;[QueryInterceptor]&lt;/STRONG&gt;; the method must have the following signature:&lt;/P&gt;&lt;PRE class="brush: csharp"&gt;[QueryInterceptor("Author")]
public Expression&amp;lt;Func&amp;lt;Author, Boolean&amp;gt;&amp;gt; OnFilterAuthor()
{
&amp;nbsp;&amp;nbsp;&amp;nbsp; return (author =&amp;gt; author.Name == "Ricardo Peres");
}
&lt;/PRE&gt;
&lt;P mce_keep="true"&gt;Regardless of the query that you specify on the client proxy or the URL, this restriction is always enforced. The name and visibility are ignored.&lt;/P&gt;
&lt;P mce_keep="true"&gt;Interception queries, on the other hand, allow you to change the entity that is being submitted for persistence, or cancel the operation totally. Decorate a method with a &lt;STRONG&gt;[ChangeInterceptor]&lt;/STRONG&gt; attribute and add this arguments:&lt;/P&gt;&lt;PRE class="brush: csharp"&gt;[ChangeInterceptor("Author")]
public void OnChangeAuthor(Author author, UpdateOperations operations)
{
&amp;nbsp;&amp;nbsp;&amp;nbsp; if (operations == UpdateOperations.Add)
&amp;nbsp;&amp;nbsp;&amp;nbsp; {
nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;author.Name = "Ricardo Peres";
&amp;nbsp;&amp;nbsp;&amp;nbsp; }}
&lt;/PRE&gt;
&lt;P mce_keep="true"&gt;Once again, the visibility and name do not count.&lt;/P&gt;&lt;A class=addthis_button href="http://www.addthis.com/bookmark.php?v=250&amp;amp;pub=xa-4a96c06008dc31e0" mce_href="http://www.addthis.com/bookmark.php?v=250&amp;amp;pub=xa-4a96c06008dc31e0"&gt;&lt;IMG style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; BORDER-TOP: 0px; BORDER-RIGHT: 0px" alt="Bookmark and Share" src="http://s7.addthis.com/static/btn/v2/lg-share-en.gif" width=125 height=16 mce_src="http://s7.addthis.com/static/btn/v2/lg-share-en.gif"&gt;&lt;/A&gt;
&lt;SCRIPT type=text/javascript src="http://s7.addthis.com/js/250/addthis_widget.js?pub=xa-4a96c06008dc31e0" mce_src="http://s7.addthis.com/js/250/addthis_widget.js?pub=xa-4a96c06008dc31e0"&gt;&lt;/SCRIPT&gt;

&lt;SCRIPT type=text/javascript&gt;
SyntaxHighlighter.config.clipboardSwf = 'http://alexgorbatchev.com/pub/sh/2.0.320/scripts/clipboard.swf';
SyntaxHighlighter.brushes.CSharp.aliases = ["c#", "c-sharp", "csharp"];
SyntaxHighlighter.all();
&lt;/SCRIPT&gt;

&lt;SCRIPT type=text/javascript src="http://shots.snap.com/ss/7dcf59af71ae4ef1d02a114a733595f1/snap_shots.js"&gt;&lt;/SCRIPT&gt;
 &lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7244735" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/ricardoperes/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/ricardoperes/archive/tags/ADO.NET+Data+Services/default.aspx">ADO.NET Data Services</category></item><item><title>NHibernate 2.1.1 Released</title><link>http://weblogs.asp.net/ricardoperes/archive/2009/11/01/nhibernate-2-1-1-released.aspx</link><pubDate>Sun, 01 Nov 2009 18:08:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:7244726</guid><dc:creator>Ricardo Peres</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/ricardoperes/rsscomments.aspx?PostID=7244726</wfw:commentRss><comments>http://weblogs.asp.net/ricardoperes/archive/2009/11/01/nhibernate-2-1-1-released.aspx#comments</comments><description>&lt;link type="text/css" rel="stylesheet" href="http://alexgorbatchev.com/pub/sh/2.0.320/styles/shCore.css"/&gt; 
&lt;link type="text/css" rel="stylesheet" href="http://alexgorbatchev.com/pub/sh/2.0.320/styles/shThemeDefault.css" id="shTheme"/&gt;
&lt;p&gt;Get it &lt;a href="http://sourceforge.net/projects/nhibernate/files" target="_blank" title="NHibernate"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Intersting to note, the API documentation is now available in CHM format.&lt;/p&gt;
&lt;script type="text/javascript" src="http://shots.snap.com/ss/7dcf59af71ae4ef1d02a114a733595f1/snap_shots.js"&gt;&lt;/script&gt;
&lt;a class="addthis_button" href="http://www.addthis.com/bookmark.php?v=250&amp;amp;pub=xa-4a96c06008dc31e0" mce_href="http://www.addthis.com/bookmark.php?v=250&amp;amp;pub=xa-4a96c06008dc31e0"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; border-top: 0px; border-right: 0px" alt="Bookmark and Share" src="http://s7.addthis.com/static/btn/v2/lg-share-en.gif" width="125" height="16" mce_src="http://s7.addthis.com/static/btn/v2/lg-share-en.gif"&gt;&lt;/a&gt;
&lt;script type=text/javascript src="http://s7.addthis.com/js/250/addthis_widget.js?pub=xa-4a96c06008dc31e0" mce_src="http://s7.addthis.com/js/250/addthis_widget.js?pub=xa-4a96c06008dc31e0"&gt;&lt;/script&gt;
&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7244726" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/ricardoperes/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/ricardoperes/archive/tags/NHibernate/default.aspx">NHibernate</category></item><item><title>Number Parsing in JavaScript</title><link>http://weblogs.asp.net/ricardoperes/archive/2009/10/20/number-parsing-in-javascript.aspx</link><pubDate>Tue, 20 Oct 2009 18:14:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:7234072</guid><dc:creator>Ricardo Peres</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/ricardoperes/rsscomments.aspx?PostID=7234072</wfw:commentRss><comments>http://weblogs.asp.net/ricardoperes/archive/2009/10/20/number-parsing-in-javascript.aspx#comments</comments><description>&lt;LINK rel=stylesheet type=text/css href="http://alexgorbatchev.com/pub/sh/2.0.320/styles/shCore.css"&gt;&lt;/LINK&gt;&lt;LINK id=shTheme rel=stylesheet type=text/css href="http://alexgorbatchev.com/pub/sh/2.0.320/styles/shThemeDefault.css"&gt;&lt;/LINK&gt;
&lt;SCRIPT type=text/javascript src="http://alexgorbatchev.com/pub/sh/2.0.320/scripts/shCore.js"&gt;&lt;/SCRIPT&gt;

&lt;SCRIPT type=text/javascript src="http://alexgorbatchev.com/pub/sh/2.0.320/scripts/shBrushXml.js"&gt;&lt;/SCRIPT&gt;

&lt;P mce_keep="true"&gt;How many times did you have this in your code:&lt;/P&gt;&lt;PRE class="brush: xml"&gt;var str = getSomeNumber(); //say, 1212

var num = parseInt(str);

window.alert('Number is: ' + num);&amp;nbsp; //Number is: 1212

&lt;/PRE&gt;
&lt;P mce_keep="true"&gt;Nothing special about it... or is it?&lt;/P&gt;
&lt;P mce_keep="true"&gt;It happens that JavaScript's parseInt function is smarter than you think (and, probably, smarter that it should): it tries to interpret the string passed as a parameter and returns the result based on its perceived radix, which may not be 10. An example? Try this:&lt;/P&gt;&lt;PRE class="brush: xml"&gt;window.alert('Number is: ' + parseInt('010')); //Number is: 8!!

&lt;/PRE&gt;
&lt;P mce_keep="true"&gt;So, what's the solution? Simply pass the appropriate radix as the second parameter for parseInt:&lt;/P&gt;&lt;PRE class="brush: xml"&gt;window.alert('Number is: ' + parseInt('010', 10)); //Number is: 10!! Alright!!

&lt;/PRE&gt;&lt;A class=addthis_button href="http://www.addthis.com/bookmark.php?v=250&amp;amp;pub=xa-4a96c06008dc31e0" mce_href="http://www.addthis.com/bookmark.php?v=250&amp;amp;pub=xa-4a96c06008dc31e0"&gt;&lt;IMG style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; BORDER-TOP: 0px; BORDER-RIGHT: 0px" alt="Bookmark and Share" src="http://s7.addthis.com/static/btn/v2/lg-share-en.gif" width=125 height=16 mce_src="http://s7.addthis.com/static/btn/v2/lg-share-en.gif"&gt;&lt;/A&gt;
&lt;SCRIPT type=text/javascript src="http://s7.addthis.com/js/250/addthis_widget.js?pub=xa-4a96c06008dc31e0" mce_src="http://s7.addthis.com/js/250/addthis_widget.js?pub=xa-4a96c06008dc31e0"&gt;&lt;/SCRIPT&gt;

&lt;SCRIPT type=text/javascript&gt;
SyntaxHighlighter.config.clipboardSwf = 'http://alexgorbatchev.com/pub/sh/2.0.320/scripts/clipboard.swf';
SyntaxHighlighter.brushes.Xml.aliases = ['xml'];
SyntaxHighlighter.all();
&lt;/SCRIPT&gt;

&lt;SCRIPT type=text/javascript src="http://shots.snap.com/ss/7dcf59af71ae4ef1d02a114a733595f1/snap_shots.js"&gt;&lt;/SCRIPT&gt;
 &lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7234072" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/ricardoperes/archive/tags/Web/default.aspx">Web</category><category domain="http://weblogs.asp.net/ricardoperes/archive/tags/JavaScript/default.aspx">JavaScript</category></item><item><title>Microsoft Sync Framework SDK 2.0 Released</title><link>http://weblogs.asp.net/ricardoperes/archive/2009/10/19/microsoft-sync-framework-sdk-2-0-released.aspx</link><pubDate>Mon, 19 Oct 2009 16:52:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:7233091</guid><dc:creator>Ricardo Peres</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/ricardoperes/rsscomments.aspx?PostID=7233091</wfw:commentRss><comments>http://weblogs.asp.net/ricardoperes/archive/2009/10/19/microsoft-sync-framework-sdk-2-0-released.aspx#comments</comments><description>&lt;P mce_keep="true"&gt;Get it from &lt;A title="Sync Framework SDK 2.0" href="http://www.microsoft.com/downloads/details.aspx?FamilyID=89adbb1e-53ff-41b5-ba17-8e43a2e66254&amp;amp;displaylang=en" target=_blank mce_href="http://www.microsoft.com/downloads/details.aspx?FamilyID=89adbb1e-53ff-41b5-ba17-8e43a2e66254&amp;amp;displaylang=en"&gt;here&lt;/A&gt;. Read about this release on its &lt;A title="Sync Framework" href="http://msdn.microsoft.com/sync/default.aspx" target=_blank mce_href="http://msdn.microsoft.com/sync/default.aspx"&gt;site&lt;/A&gt;.&lt;/P&gt;&lt;A class=addthis_button href="http://www.addthis.com/bookmark.php?v=250&amp;amp;pub=xa-4a96c06008dc31e0" mce_href="http://www.addthis.com/bookmark.php?v=250&amp;amp;pub=xa-4a96c06008dc31e0"&gt;&lt;IMG style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; BORDER-TOP: 0px; BORDER-RIGHT: 0px" alt="Bookmark and Share" src="http://s7.addthis.com/static/btn/v2/lg-share-en.gif" width=125 height=16 mce_src="http://s7.addthis.com/static/btn/v2/lg-share-en.gif"&gt;&lt;/A&gt;
&lt;SCRIPT type=text/javascript src="http://s7.addthis.com/js/250/addthis_widget.js?pub=xa-4a96c06008dc31e0" mce_src="http://s7.addthis.com/js/250/addthis_widget.js?pub=xa-4a96c06008dc31e0"&gt;&lt;/SCRIPT&gt;

&lt;SCRIPT type=text/javascript src="http://shots.snap.com/ss/7dcf59af71ae4ef1d02a114a733595f1/snap_shots.js"&gt;&lt;/SCRIPT&gt;
 &lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7233091" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/ricardoperes/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/ricardoperes/archive/tags/Libraries/default.aspx">Libraries</category><category domain="http://weblogs.asp.net/ricardoperes/archive/tags/Sync+Framework/default.aspx">Sync Framework</category></item><item><title>ADO.NET Data Services and NHibernate</title><link>http://weblogs.asp.net/ricardoperes/archive/2009/10/15/ado-net-data-services-and-nhibernate.aspx</link><pubDate>Thu, 15 Oct 2009 09:28:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:7230447</guid><dc:creator>Ricardo Peres</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/ricardoperes/rsscomments.aspx?PostID=7230447</wfw:commentRss><comments>http://weblogs.asp.net/ricardoperes/archive/2009/10/15/ado-net-data-services-and-nhibernate.aspx#comments</comments><description>&lt;LINK rel=stylesheet type=text/css href="http://alexgorbatchev.com/pub/sh/2.0.320/styles/shCore.css"&gt;&lt;/LINK&gt;&lt;LINK id=shTheme rel=stylesheet type=text/css href="http://alexgorbatchev.com/pub/sh/2.0.320/styles/shThemeDefault.css"&gt;&lt;/LINK&gt;
&lt;SCRIPT type=text/javascript src="http://alexgorbatchev.com/pub/sh/2.0.320/scripts/shCore.js"&gt;&lt;/SCRIPT&gt;

&lt;SCRIPT type=text/javascript src="http://alexgorbatchev.com/pub/sh/2.0.320/scripts/shBrushCSharp.js"&gt;&lt;/SCRIPT&gt;

&lt;SCRIPT type=text/javascript src="http://alexgorbatchev.com/pub/sh/2.0.320/scripts/shBrushCss.js"&gt;&lt;/SCRIPT&gt;

&lt;SCRIPT type=text/javascript src="http://alexgorbatchev.com/pub/sh/2.0.320/scripts/shBrushXml.js"&gt;&lt;/SCRIPT&gt;

&lt;SCRIPT type=text/javascript src="http://alexgorbatchev.com/pub/sh/2.0.320/scripts/shBrushSql.js"&gt;&lt;/SCRIPT&gt;

&lt;SCRIPT type=text/javascript src="http://shots.snap.com/ss/7dcf59af71ae4ef1d02a114a733595f1/snap_shots.js"&gt;&lt;/SCRIPT&gt;

&lt;P mce_keep="true"&gt;With the arrival of the LINQ provider for NHibernate, NHibernate now supports ADO.NET Data Services. There are some restrictions, however:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;
&lt;DIV mce_keep="true"&gt;Relations must be entities or simple collections of entities (Entity, IList, IList&amp;lt;T&amp;gt;), not sets (ISet&amp;lt;T&amp;gt;, HashSet&amp;lt;T&amp;gt;) or maps (IDictionary, IDictionary&amp;lt;K, V&amp;gt;, HashTable);&lt;/DIV&gt;&lt;/LI&gt;
&lt;LI&gt;
&lt;DIV mce_keep="true"&gt;The ID property must be called either "ID", or end with "ID", for example, CustomerID;&lt;/DIV&gt;&lt;/LI&gt;
&lt;LI&gt;
&lt;DIV mce_keep="true"&gt;The ID property must have a public setter as well as a public getter;&lt;/DIV&gt;&lt;/LI&gt;
&lt;LI&gt;
&lt;DIV mce_keep="true"&gt;The ID property must be of a base type, such as int or string;&lt;/DIV&gt;&lt;/LI&gt;
&lt;LI&gt;
&lt;DIV mce_keep="true"&gt;The collections to expose must be properties of type IQueryable&amp;lt;T&amp;gt; or IOrderedQueryable&amp;lt;T&amp;gt;.&lt;/DIV&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;P mce_keep="true"&gt;Here is an example:&lt;/P&gt;&lt;PRE class="brush: csharp"&gt;public class Customer

{

&amp;nbsp;&amp;nbsp;&amp;nbsp; public virtual Int32 ID

&amp;nbsp;&amp;nbsp;&amp;nbsp; {

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; set;

&amp;nbsp;&amp;nbsp;&amp;nbsp; }

&amp;nbsp;&amp;nbsp;&amp;nbsp; public virtual IList&amp;lt;Orders&amp;gt; Orders

&amp;nbsp;&amp;nbsp;&amp;nbsp; {

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private set;

&amp;nbsp;&amp;nbsp;&amp;nbsp; }

}

public class CustomersOrdersContext: NHibernateContext

{

&amp;nbsp;&amp;nbsp;&amp;nbsp; public CustomersOrdersContext()

&amp;nbsp;&amp;nbsp;&amp;nbsp; {

&amp;nbsp;&amp;nbsp;&amp;nbsp; }

&amp;nbsp;&amp;nbsp;&amp;nbsp; public CustomersOrdersContext(ISession session): base(session)

;nbsp;&amp;nbsp;&amp;nbsp; {

&amp;nbsp;&amp;nbsp;&amp;nbsp; }

&amp;nbsp;&amp;nbsp;&amp;nbsp; public IOrderedQueryable&amp;lt;Orders&amp;gt; Orders

&amp;nbsp;&amp;nbsp;&amp;nbsp; {

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return(this.Session.Linq&amp;lt;Orders&amp;gt;();

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }

&amp;nbsp;&amp;nbsp;&amp;nbsp; }

&amp;nbsp;&amp;nbsp;&amp;nbsp; public IOrderedQueryable&amp;lt;Customers&amp;gt; Customers

&amp;nbsp;&amp;nbsp;&amp;nbsp; {

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return(this.Session.Linq&amp;lt;Customers&amp;gt;();

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }

&amp;nbsp;&amp;nbsp;&amp;nbsp; }

}
&lt;/PRE&gt;
&lt;P mce_keep="true"&gt;And, on the ADO.NET Data Services class:&lt;/P&gt;&lt;PRE class="brush: csharp"&gt;[ServiceBehavior(IncludeExceptionDetailsInFaults = true)]&amp;nbsp;

public class CustomersOrdersDataService: DataService&amp;lt;CustomersOrdersContext&amp;gt;

{

&amp;nbsp;&amp;nbsp;&amp;nbsp; public static void InitializeService(IDataServiceConfiguration config)

&amp;nbsp;&amp;nbsp;&amp;nbsp; {

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; config.SetEntitySetAccessRule("*", EntitySetRights.All);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; config.SetServiceOperationAccessRule("*", ServiceOperationRights.All);

&amp;nbsp;&amp;nbsp;&amp;nbsp; }

}
&lt;/PRE&gt;
&lt;P mce_keep="true"&gt;The IncludeExceptionDetailsInFaults helps debugging any exceptions that may occur, you should remove it in production code.&lt;/P&gt;&lt;A class=addthis_button href="http://www.addthis.com/bookmark.php?v=250&amp;amp;pub=xa-4a96c06008dc31e0" mce_href="http://www.addthis.com/bookmark.php?v=250&amp;amp;pub=xa-4a96c06008dc31e0"&gt;&lt;IMG style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; BORDER-TOP: 0px; BORDER-RIGHT: 0px" alt="Bookmark and Share" src="http://s7.addthis.com/static/btn/v2/lg-share-en.gif" width=125 height=16 mce_src="http://s7.addthis.com/static/btn/v2/lg-share-en.gif"&gt;&lt;/A&gt;
&lt;SCRIPT type=text/javascript src="http://s7.addthis.com/js/250/addthis_widget.js?pub=xa-4a96c06008dc31e0" mce_src="http://s7.addthis.com/js/250/addthis_widget.js?pub=xa-4a96c06008dc31e0"&gt;&lt;/SCRIPT&gt;

&lt;SCRIPT type=text/javascript&gt;
SyntaxHighlighter.config.clipboardSwf = 'http://alexgorbatchev.com/pub/sh/2.0.320/scripts/clipboard.swf';
SyntaxHighlighter.brushes.CSharp.aliases = ["c#", "c-sharp", "csharp"];
SyntaxHighlighter.all();
&lt;/SCRIPT&gt;
 &lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7230447" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/ricardoperes/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/ricardoperes/archive/tags/NHibernate/default.aspx">NHibernate</category><category domain="http://weblogs.asp.net/ricardoperes/archive/tags/Web+Services/default.aspx">Web Services</category><category domain="http://weblogs.asp.net/ricardoperes/archive/tags/ADO.NET+Data+Services/default.aspx">ADO.NET Data Services</category></item><item><title>Manually Indexing an Entity with NHibernate Search</title><link>http://weblogs.asp.net/ricardoperes/archive/2009/10/13/manually-indexing-entity-with-nhibernate-search.aspx</link><pubDate>Tue, 13 Oct 2009 13:22:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:7228810</guid><dc:creator>Ricardo Peres</dc:creator><slash:comments>3</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/ricardoperes/rsscomments.aspx?PostID=7228810</wfw:commentRss><comments>http://weblogs.asp.net/ricardoperes/archive/2009/10/13/manually-indexing-entity-with-nhibernate-search.aspx#comments</comments><description>&lt;LINK rel=stylesheet type=text/css href="http://alexgorbatchev.com/pub/sh/2.0.320/styles/shCore.css"&gt;&lt;/LINK&gt;&lt;LINK id=shTheme rel=stylesheet type=text/css href="http://alexgorbatchev.com/pub/sh/2.0.320/styles/shThemeDefault.css"&gt;&lt;/LINK&gt;
&lt;SCRIPT type=text/javascript src="http://alexgorbatchev.com/pub/sh/2.0.320/scripts/shCore.js"&gt;&lt;/SCRIPT&gt;

&lt;SCRIPT type=text/javascript src="http://alexgorbatchev.com/pub/sh/2.0.320/scripts/shBrushCSharp.js"&gt;&lt;/SCRIPT&gt;

&lt;SCRIPT type=text/javascript src="http://shots.snap.com/ss/7dcf59af71ae4ef1d02a114a733595f1/snap_shots.js"&gt;&lt;/SCRIPT&gt;

&lt;P mce_keep="true" style="font-weight:bold;"&gt;Updated: thanks, Ayende!&lt;/P&gt;

&lt;P mce_keep="true"&gt;NHibernate Search, which you can get in source format&amp;nbsp;with SVN from the NHContrib trunk &lt;A title="NHibernate Search" href="https://nhcontrib.svn.sourceforge.net/svnroot/nhcontrib/trunk/src/NHibernate.Search/" target=_blank mce_href="https://nhcontrib.svn.sourceforge.net/svnroot/nhcontrib/trunk/src/NHibernate.Search/"&gt;here&lt;/A&gt;, is an API that&amp;nbsp;integrates NHibernate with the popular indexer Lucene.NET. Out of the box, it indexes the properties from your entities, the way you want it to (at the moment, only by using attributes), at insert/update/delete time, through the use of listeners. But what if you want to index an entity that already comes from the DB? Let's see how this can be done.&lt;/P&gt;
&lt;P mce_keep="true"&gt;First, out entity:&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;&lt;PRE class="brush: csharp"&gt;[Indexed]
public class SomeClass
{
	[DocumentId]
	public virtual Int32 Id
	{
		get;
		private set;
	}

	[Field(Index.Tokenized, Store = Store.Yes)]
	public virtual String SomeProperty
	{
		get;
		set;
	}
}
&lt;/PRE&gt;
&lt;P mce_keep="true"&gt;Then, use this code:&lt;/P&gt;&lt;PRE class="brush: csharp"&gt;Configuration cfg = ...;
ISession session = ...;
SomeClass a = ...;

using (IFullTextSession searchSession = Search.CreateFullTextSession(session))
{
    searchSession.Index(a);
}

&lt;/PRE&gt;
&lt;P mce_keep="true"&gt;And, finally, query it using this:&lt;/P&gt;&lt;PRE class="brush: csharp"&gt;IList&amp;lt;SomeClass&amp;gt; items = searchSession.CreateFullTextQuery&amp;lt;SomeClass&amp;gt;("SomeProperty:SomeValue").List&amp;lt;SomeClass&amp;gt;();
&lt;/PRE&gt;&lt;A class=addthis_button href="http://www.addthis.com/bookmark.php?v=250&amp;amp;pub=xa-4a96c06008dc31e0" mce_href="http://www.addthis.com/bookmark.php?v=250&amp;amp;pub=xa-4a96c06008dc31e0"&gt;&lt;IMG style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; BORDER-TOP: 0px; BORDER-RIGHT: 0px" alt="Bookmark and Share" src="http://s7.addthis.com/static/btn/v2/lg-share-en.gif" width=125 height=16 mce_src="http://s7.addthis.com/static/btn/v2/lg-share-en.gif"&gt;&lt;/A&gt;
&lt;SCRIPT type=text/javascript src="http://s7.addthis.com/js/250/addthis_widget.js?pub=xa-4a96c06008dc31e0" mce_src="http://s7.addthis.com/js/250/addthis_widget.js?pub=xa-4a96c06008dc31e0"&gt;&lt;/SCRIPT&gt;

&lt;SCRIPT type=text/javascript&gt;
SyntaxHighlighter.config.clipboardSwf = 'http://alexgorbatchev.com/pub/sh/2.0.320/scripts/clipboard.swf';
SyntaxHighlighter.brushes.CSharp.aliases = ["c#", "c-sharp", "csharp"];
SyntaxHighlighter.all();
&lt;/SCRIPT&gt;
 &lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7228810" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/ricardoperes/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/ricardoperes/archive/tags/NHibernate/default.aspx">NHibernate</category><category domain="http://weblogs.asp.net/ricardoperes/archive/tags/NHibernate+Search/default.aspx">NHibernate Search</category></item><item><title>Finding Dirty Properties in NHibernate</title><link>http://weblogs.asp.net/ricardoperes/archive/2009/10/09/finding-dirty-properties-in-nhibernate.aspx</link><pubDate>Fri, 09 Oct 2009 10:59:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:7226074</guid><dc:creator>Ricardo Peres</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/ricardoperes/rsscomments.aspx?PostID=7226074</wfw:commentRss><comments>http://weblogs.asp.net/ricardoperes/archive/2009/10/09/finding-dirty-properties-in-nhibernate.aspx#comments</comments><description>&lt;LINK rel=stylesheet type=text/css href="http://alexgorbatchev.com/pub/sh/2.0.320/styles/shCore.css"&gt;&lt;/LINK&gt;&lt;LINK id=shTheme rel=stylesheet type=text/css href="http://alexgorbatchev.com/pub/sh/2.0.320/styles/shThemeDefault.css"&gt;&lt;/LINK&gt;
&lt;SCRIPT type=text/javascript src="http://alexgorbatchev.com/pub/sh/2.0.320/scripts/shCore.js"&gt;&lt;/SCRIPT&gt;

&lt;SCRIPT type=text/javascript src="http://alexgorbatchev.com/pub/sh/2.0.320/scripts/shBrushCSharp.js"&gt;&lt;/SCRIPT&gt;

&lt;SCRIPT type=text/javascript src="http://alexgorbatchev.com/pub/sh/2.0.320/scripts/shBrushCss.js"&gt;&lt;/SCRIPT&gt;

&lt;SCRIPT type=text/javascript src="http://alexgorbatchev.com/pub/sh/2.0.320/scripts/shBrushXml.js"&gt;&lt;/SCRIPT&gt;

&lt;SCRIPT type=text/javascript src="http://alexgorbatchev.com/pub/sh/2.0.320/scripts/shBrushSql.js"&gt;&lt;/SCRIPT&gt;

&lt;P mce_keep="true"&gt;Sometimes there may be a need for finding out if a specific entity, or a property of that entity, was changed, or, better yet, the original value for that property.&lt;/P&gt;
&lt;P mce_keep="true"&gt;Below is a set of extensions for &lt;STRONG&gt;ISession&lt;/STRONG&gt; that give you just that.&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;&lt;PRE class="brush: csharp"&gt;public static class SessionExtensions
	{
		public static Boolean IsDirtyEntity(this ISession session, Object entity)
		{
			String className = NHibernateProxyHelper.GuessClass(entity).FullName;
			ISessionImplementor sessionImpl = session.GetSessionImplementation();
			IPersistenceContext persistenceContext = sessionImpl.PersistenceContext;
			IEntityPersister persister = sessionImpl.Factory.GetEntityPersister(className);
			EntityEntry oldEntry = sessionImpl.PersistenceContext.GetEntry(entity);

			if ((oldEntry == null) &amp;amp;&amp;amp; (entity is INHibernateProxy))
			{
				INHibernateProxy proxy = entity as INHibernateProxy;
				Object obj = sessionImpl.PersistenceContext.Unproxy(proxy);
				oldEntry = sessionImpl.PersistenceContext.GetEntry(obj);
			}

			Object [] oldState = oldEntry.LoadedState;
			Object [] currentState = persister.GetPropertyValues(entity, sessionImpl.EntityMode);
			Int32 [] dirtyProps = persister.FindDirty(currentState, oldState, entity, sessionImpl);
			
			return (dirtyProps != null);
		}

		public static Boolean IsDirtyProperty(this ISession session, Object entity, String propertyName)
		{
			String className = NHibernateProxyHelper.GuessClass(entity).FullName;
			ISessionImplementor sessionImpl = session.GetSessionImplementation();
			IPersistenceContext persistenceContext = sessionImpl.PersistenceContext;
			IEntityPersister persister = sessionImpl.Factory.GetEntityPersister(className);
			EntityEntry oldEntry = sessionImpl.PersistenceContext.GetEntry(entity);

			if ((oldEntry == null) &amp;amp;&amp;amp; (entity is INHibernateProxy))
			{
				INHibernateProxy proxy = entity as INHibernateProxy;
				Object obj = sessionImpl.PersistenceContext.Unproxy(proxy);
				oldEntry = sessionImpl.PersistenceContext.GetEntry(obj);
			}

			Object [] oldState = oldEntry.LoadedState;
			Object [] currentState = persister.GetPropertyValues(entity, sessionImpl.EntityMode);
			Int32 [] dirtyProps = persister.FindDirty(currentState, oldState, entity, sessionImpl);
			Int32 index = Array.IndexOf(persister.PropertyNames, propertyName);

			Boolean isDirty = (dirtyProps != null) ? (Array.IndexOf(dirtyProps, index) != -1) : false;

			return (isDirty);
		}

		public static Object GetOriginalEntityProperty(this ISession session, Object entity, String propertyName)
		{
			String className = NHibernateProxyHelper.GuessClass(entity).FullName;
			ISessionImplementor sessionImpl = session.GetSessionImplementation();
			IPersistenceContext persistenceContext = sessionImpl.PersistenceContext;
			IEntityPersister persister = sessionImpl.Factory.GetEntityPersister(className);
			EntityEntry oldEntry = sessionImpl.PersistenceContext.GetEntry(entity);

			if ((oldEntry == null) &amp;amp;&amp;amp; (entity is INHibernateProxy))
			{
				INHibernateProxy proxy = entity as INHibernateProxy;
				Object obj = sessionImpl.PersistenceContext.Unproxy(proxy);
				oldEntry = sessionImpl.PersistenceContext.GetEntry(obj);
			}

			Object [] oldState = oldEntry.LoadedState;
			Object [] currentState = persister.GetPropertyValues(entity, sessionImpl.EntityMode);
			Int32 [] dirtyProps = persister.FindDirty(currentState, oldState, entity, sessionImpl);
			Int32 index = Array.IndexOf(persister.PropertyNames, propertyName);

			Boolean isDirty = (dirtyProps != null) ? (Array.IndexOf(dirtyProps, index) != -1) : false;

			return ((isDirty == true) ? oldState [ index ] : currentState [ index ]);
		}
	}

&lt;/PRE&gt;
&lt;SCRIPT type=text/javascript&gt;
SyntaxHighlighter.config.clipboardSwf = 'http://alexgorbatchev.com/pub/sh/2.0.320/scripts/clipboard.swf';
SyntaxHighlighter.brushes.CSharp.aliases = ["c#", "c-sharp", "csharp"];
SyntaxHighlighter.all();
&lt;/SCRIPT&gt;
&lt;A class=addthis_button href="http://www.addthis.com/bookmark.php?v=250&amp;amp;pub=xa-4a96c06008dc31e0" mce_href="http://www.addthis.com/bookmark.php?v=250&amp;amp;pub=xa-4a96c06008dc31e0"&gt;&lt;IMG style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; BORDER-TOP: 0px; BORDER-RIGHT: 0px" alt="Bookmark and Share" src="http://s7.addthis.com/static/btn/v2/lg-share-en.gif" width=125 height=16 mce_src="http://s7.addthis.com/static/btn/v2/lg-share-en.gif"&gt;&lt;/A&gt;
&lt;SCRIPT type=text/javascript src="http://s7.addthis.com/js/250/addthis_widget.js?pub=xa-4a96c06008dc31e0" mce_src="http://s7.addthis.com/js/250/addthis_widget.js?pub=xa-4a96c06008dc31e0"&gt;&lt;/SCRIPT&gt;
 &lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7226074" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/ricardoperes/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/ricardoperes/archive/tags/NHibernate/default.aspx">NHibernate</category><category domain="http://weblogs.asp.net/ricardoperes/archive/tags/OR_2F00_M/default.aspx">OR/M</category></item><item><title>.NET Serializers, part 2</title><link>http://weblogs.asp.net/ricardoperes/archive/2009/10/08/net-serializers-part-2.aspx</link><pubDate>Thu, 08 Oct 2009 14:05:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:7225522</guid><dc:creator>Ricardo Peres</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/ricardoperes/rsscomments.aspx?PostID=7225522</wfw:commentRss><comments>http://weblogs.asp.net/ricardoperes/archive/2009/10/08/net-serializers-part-2.aspx#comments</comments><description>&lt;P mce_keep="true"&gt;There were some things left (well, a lot, actually) from my previous article on &lt;A title=".NET Serializers" href="http://weblogs.asp.net/ricardoperes/archive/2009/10/08/net-serializers.aspx" target=_blank mce_href="http://weblogs.asp.net/ricardoperes/archive/2009/10/08/net-serializers.aspx"&gt;.NET serializers&lt;/A&gt;. One of these things was the ability to have serializers call specific methods before or after serialization. This can be achieved in two ways:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;
&lt;DIV mce_keep="true"&gt;Through implementation of interfaces;&lt;/DIV&gt;&lt;/LI&gt;
&lt;LI&gt;
&lt;DIV mce_keep="true"&gt;Through the use of attributes.&lt;/DIV&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;P mce_keep="true"&gt;Interface &lt;STRONG&gt;System.Runtime.Serialization.IDeserializationCallback&lt;/STRONG&gt;&amp;nbsp;defines a method named &lt;STRONG&gt;OnDeserialization&lt;/STRONG&gt; that is called after de deserialization process. You receive the deserialized object as its only argument and you can change it at your will. Only works with &lt;STRONG&gt;IFormatter&lt;/STRONG&gt;-based serializers, such as &lt;STRONG&gt;BinaryFormatter&lt;/STRONG&gt; and &lt;STRONG&gt;SoapFormatter&lt;/STRONG&gt;, not with &lt;STRONG&gt;XmlSerializer&lt;/STRONG&gt;.&lt;/P&gt;
&lt;P mce_keep="true"&gt;As for attributes, the following can be applied to methods of your class:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;
&lt;DIV mce_keep="true"&gt;&lt;STRONG&gt;System.Runtime.Serialization.OnSerializingAttribute&lt;/STRONG&gt; (&lt;STRONG&gt;IFormatter&lt;/STRONG&gt; and &lt;STRONG&gt;XmlObjectSerializer&lt;/STRONG&gt;) &lt;/DIV&gt;&lt;/LI&gt;
&lt;LI&gt;
&lt;DIV mce_keep="true"&gt;&lt;STRONG&gt;System.Runtime.Serialization.OnSerializedAttribute&lt;/STRONG&gt; (&lt;STRONG&gt;IFormatter&lt;/STRONG&gt; and &lt;STRONG&gt;XmlObjectSerializer&lt;/STRONG&gt;) &lt;/DIV&gt;&lt;/LI&gt;
&lt;LI&gt;
&lt;DIV mce_keep="true"&gt;&lt;STRONG&gt;System.Runtime.Serialization.OnDeserializingAttribute&lt;/STRONG&gt; (&lt;STRONG&gt;IFormatter&lt;/STRONG&gt; and &lt;STRONG&gt;XmlObjectSerializer&lt;/STRONG&gt;) &lt;/DIV&gt;&lt;/LI&gt;
&lt;LI&gt;
&lt;DIV mce_keep="true"&gt;&lt;STRONG&gt;System.Runtime.Serialization.OnDeserializedAttribute&lt;/STRONG&gt; (&lt;STRONG&gt;IFormatter&lt;/STRONG&gt; and &lt;STRONG&gt;XmlObjectSerializer&lt;/STRONG&gt;)&lt;/DIV&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;P mce_keep="true"&gt;Doesn't matter if the methods are public or private, but they must have the following signature:&lt;/P&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;
&lt;P&gt;void &lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;MethodName(&lt;/FONT&gt;&lt;FONT color=#2b91af size=2&gt;&lt;FONT color=#2b91af size=2&gt;StreamingContext&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; ctx)&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2&gt;Through the &lt;STRONG&gt;StreamingContext&lt;/STRONG&gt; parameter you can access the properties that will be serialized or deserialized and act upon them.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2&gt;Please notice that the attribute-based approach is the only one that works with WCF, which uses &lt;STRONG&gt;XmlObjectSerializer&lt;/STRONG&gt;-based serializers, as well as &lt;STRONG&gt;IFormatter&lt;/STRONG&gt;-based.&lt;/FONT&gt;&lt;/P&gt;&lt;A class=addthis_button href="http://www.addthis.com/bookmark.php?v=250&amp;amp;pub=xa-4a96c06008dc31e0" mce_href="http://www.addthis.com/bookmark.php?v=250&amp;amp;pub=xa-4a96c06008dc31e0"&gt;&lt;IMG style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; BORDER-TOP: 0px; BORDER-RIGHT: 0px" alt="Bookmark and Share" src="http://s7.addthis.com/static/btn/v2/lg-share-en.gif" width=125 height=16 mce_src="http://s7.addthis.com/static/btn/v2/lg-share-en.gif"&gt;&lt;/A&gt;
&lt;SCRIPT type=text/javascript src="http://s7.addthis.com/js/250/addthis_widget.js?pub=xa-4a96c06008dc31e0" mce_src="http://s7.addthis.com/js/250/addthis_widget.js?pub=xa-4a96c06008dc31e0"&gt;&lt;/SCRIPT&gt;
 &lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7225522" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/ricardoperes/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/ricardoperes/archive/tags/Serialization/default.aspx">Serialization</category></item><item><title>.NET Serializers</title><link>http://weblogs.asp.net/ricardoperes/archive/2009/10/08/net-serializers.aspx</link><pubDate>Thu, 08 Oct 2009 10:24:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:7225394</guid><dc:creator>Ricardo Peres</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/ricardoperes/rsscomments.aspx?PostID=7225394</wfw:commentRss><comments>http://weblogs.asp.net/ricardoperes/archive/2009/10/08/net-serializers.aspx#comments</comments><description>&lt;P mce_keep="true"&gt;(UPDATED)&amp;nbsp;&lt;/P&gt;
&lt;P mce_keep="true"&gt;As of version 3.5 SP1, .NET comes along with the following serializers:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;
&lt;DIV mce_keep="true"&gt;&lt;STRONG&gt;System.Runtime.Serialization.Formatters.Binary.BinaryFormatte&lt;/STRONG&gt;&lt;STRONG&gt;r&lt;/STRONG&gt;: binary serializer used in .NET Remoting, type information is included, understands &lt;STRONG&gt;System.Runtime.Serialization.ISerializable&lt;/STRONG&gt;;&lt;/DIV&gt;&lt;/LI&gt;
&lt;LI&gt;
&lt;DIV mce_keep="true"&gt;&lt;STRONG&gt;System.Runtime.Serialization.Formatters.Soap.SoapFormatter&lt;/STRONG&gt;: SOAP (XML) serializer used in .NET Remoting, includes type information, understands &lt;STRONG&gt;System.Runtime.Serialization.ISerializable&lt;/STRONG&gt;;&lt;/DIV&gt;&lt;/LI&gt;
&lt;LI&gt;
&lt;DIV mce_keep="true"&gt;&lt;STRONG&gt;System.Runtime.Serialization.DataContractSerializer&lt;/STRONG&gt;: XML serializer used in WCF, does not include type information;&lt;/DIV&gt;&lt;/LI&gt;
&lt;LI&gt;
&lt;DIV mce_keep="true"&gt;&lt;STRONG&gt;System.Runtime.Serialization.Json.DataContractJsonSerializer&lt;/STRONG&gt;: JSON serializer used in WCF, does not include type information;&lt;/DIV&gt;&lt;/LI&gt;
&lt;LI&gt;
&lt;DIV mce_keep="true"&gt;&lt;STRONG&gt;System.Runtime.Serialization.NetDataContractSerializer&lt;/STRONG&gt;: binary serializer used in WCF, includes type information;&lt;/DIV&gt;&lt;/LI&gt;
&lt;LI&gt;
&lt;DIV mce_keep="true"&gt;&lt;STRONG&gt;System.Xml.Serialization.XmlSerializer&lt;/STRONG&gt;: XML serializer used in ASP.NET Web Services (ASMX), type information is not included, understands &lt;STRONG&gt;System.Xml.Serialization.IXmlSerializable&lt;/STRONG&gt;;&lt;STRONG&gt;&amp;nbsp;&lt;/STRONG&gt;&lt;/DIV&gt;&lt;/LI&gt;
&lt;LI&gt;
&lt;DIV mce_keep="true"&gt;&lt;STRONG&gt;System.Web.UI.LosFormatter&lt;/STRONG&gt;: uses &lt;STRONG&gt;ObjectStateFormatter&lt;/STRONG&gt; internally, does not account by itself;&lt;/DIV&gt;&lt;/LI&gt;
&lt;LI&gt;
&lt;DIV mce_keep="true"&gt;&lt;STRONG&gt;System.Web.UI.ObjectStateFormatter&lt;/STRONG&gt;: binary or text (base 64 encoded)&amp;nbsp;serializer used in ASP.NET for storing items in view state, control state and session, type information is included, understands &lt;STRONG&gt;System.Runtime.Serialization.ISerializable&lt;/STRONG&gt;.&lt;/DIV&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;P mce_keep="true"&gt;There isn't, however, a common interface for all of these serializers, and, in fact, they have quite different requirements.&lt;/P&gt;
&lt;P mce_keep="true"&gt;The base interfaces are:&lt;/P&gt;&lt;FONT size=2&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;System.Runtime.Serialization.IFormatter&lt;/STRONG&gt;: for &lt;STRONG&gt;BinaryFormatter&lt;/STRONG&gt;, &lt;STRONG&gt;SoapFormatter&lt;/STRONG&gt;, &lt;STRONG&gt;NetDataContractSerializer&lt;/STRONG&gt; and &lt;STRONG&gt;ObjectStateFormatter&lt;/STRONG&gt;;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;System.Runtime.Serialization.XmlObjectSerializer&lt;/STRONG&gt;: for &lt;STRONG&gt;DataContractSerializer&lt;/STRONG&gt;, &lt;STRONG&gt;DataContractJsonSerializer&lt;/STRONG&gt; and &lt;STRONG&gt;NetDataContractSerializer&lt;/STRONG&gt;;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;XmlSerializer&lt;/STRONG&gt; doesn't have any interface that specifies its behavior.&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;The interfaces that can be used to control the serialization process are:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;System.Runtime.Serialization.ISerializable&lt;/STRONG&gt;: for all the &lt;STRONG&gt;IFormatter&lt;/STRONG&gt; serializers;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;System.Xml.Serialization.IXmlSerializable&lt;/STRONG&gt;: for &lt;STRONG&gt;XmlSerializer&lt;/STRONG&gt;.&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;Also, there are a couple of attribute classes that can be used to control the serialization process:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;System.Runtime.Serialization.OptionalFieldAttribute&lt;/STRONG&gt; (&lt;STRONG&gt;IFormatter&lt;/STRONG&gt;): field may be missing from the serialized content&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;System.Runtime.Serialization.NonSerializedAttribute&lt;/STRONG&gt; (&lt;STRONG&gt;IFormatter&lt;/STRONG&gt;): field is not serialized&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;System.Xml.Serialization.SoapAttributeAttribute&lt;/STRONG&gt; (&lt;STRONG&gt;XmlSerializer&lt;/STRONG&gt;)&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;System.Xml.Serialization.SoapElementAttribute&lt;/STRONG&gt; (&lt;STRONG&gt;XmlSerializer&lt;/STRONG&gt;)&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;System.Xml.Serialization.SoapEnumAttribute&amp;nbsp;&lt;/STRONG&gt;(&lt;STRONG&gt;XmlSerializer&lt;/STRONG&gt;)&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;System.Xml.Serialization.SoapIgnoreAttribute&lt;/STRONG&gt; (&lt;STRONG&gt;XmlSerializer&lt;/STRONG&gt;)&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;System.Xml.Serialization.SoapIncludeAttribute&lt;/STRONG&gt; (&lt;STRONG&gt;XmlSerializer&lt;/STRONG&gt;)&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;System.Xml.Serialization.SoapTypeAttribute&lt;/STRONG&gt; (&lt;STRONG&gt;XmlSerializer&lt;/STRONG&gt;)&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;System.Xml.Serialization.SoapDocumentServiceAttribute&lt;/STRONG&gt; (&lt;STRONG&gt;XmlSerializer&lt;/STRONG&gt;): default format is Document&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;System.Xml.Serialization.SoapRpcServiceAttribute&lt;/STRONG&gt; (&lt;STRONG&gt;XmlSerializer&lt;/STRONG&gt;): default format is RPC&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;System.Xml.Serialization.SoapRpcMethodAttribute&lt;/STRONG&gt; (&lt;STRONG&gt;XmlSerializer&lt;/STRONG&gt;): method uses SOAP RPC format&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;System.Xml.Serialization.SoapDocumentMethodAttribute&lt;/STRONG&gt; (&lt;STRONG&gt;XmlSerializer&lt;/STRONG&gt;): method uses SOAP Document format&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;System.Xml.Serialization.XmlAnyAttribute&lt;/STRONG&gt; (&lt;STRONG&gt;XmlSerializer&lt;/STRONG&gt;)&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;System.Xml.Serialization.XmlAnyElementAttribute&lt;/STRONG&gt; (&lt;STRONG&gt;XmlSerializer&lt;/STRONG&gt;)&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;System.Xml.Serialization.XmlArrayAttribute&lt;/STRONG&gt; (&lt;STRONG&gt;XmlSerializer&lt;/STRONG&gt;)&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;System.Xml.Serialization.XmlArrayItemAttribute&lt;/STRONG&gt; (&lt;STRONG&gt;XmlSerializer&lt;/STRONG&gt;)&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;System.Xml.Serialization.XmlAttributeAttribute&lt;/STRONG&gt; (&lt;STRONG&gt;XmlSerializer&lt;/STRONG&gt;)&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;System.Xml.Serialization.XmlChoiceIdentifierAttribute&lt;/STRONG&gt; (&lt;STRONG&gt;XmlSerializer&lt;/STRONG&gt;)&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;System.Xml.Serialization.XmlElementAttribute&lt;/STRONG&gt; (&lt;STRONG&gt;XmlSerializer&lt;/STRONG&gt;)&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;System.Xml.Serialization.XmlEnumAttribute&lt;/STRONG&gt; (&lt;STRONG&gt;XmlSerializer&lt;/STRONG&gt;)&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;System.Xml.Serialization.XmlIgnoreAttribute&lt;/STRONG&gt; (&lt;STRONG&gt;XmlSerializer&lt;/STRONG&gt;)&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;System.Xml.Serialization.XmlIncludeAttribute&lt;/STRONG&gt; (&lt;STRONG&gt;XmlSerializer&lt;/STRONG&gt;)&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;System.Xml.Serialization.XmlRootAttribute&lt;/STRONG&gt; (&lt;STRONG&gt;XmlSerializer&lt;/STRONG&gt;)&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;System.Xml.Serialization.XmlTextAttribute&lt;/STRONG&gt; (&lt;STRONG&gt;XmlSerializer&lt;/STRONG&gt;)&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;System.Xml.Serialization.XmlTypeAttribute&lt;/STRONG&gt; (&lt;STRONG&gt;XmlSerializer&lt;/STRONG&gt;)&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN style="WIDOWS: 2; TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: 16px 'Times New Roman'; WHITE-SPACE: normal; ORPHANS: 2; LETTER-SPACING: normal; COLOR: rgb(0,0,0); WORD-SPACING: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class=Apple-style-span&gt;&lt;SPAN style="TEXT-ALIGN: left; LINE-HEIGHT: 17px; BORDER-COLLAPSE: collapse; FONT-FAMILY: Arial, Helvetica, sans-serif; COLOR: rgb(68,68,68); FONT-SIZE: 13px" class=Apple-style-span&gt;&lt;STRONG&gt;&lt;FONT color=#000000 size=2&gt;System.Xml.Serialization.XmlSchemaProviderAttribute&lt;/FONT&gt;&lt;/STRONG&gt;&lt;FONT color=#000000 size=2&gt; (&lt;STRONG&gt;XmlSerializer&lt;/STRONG&gt;): applied on a method that returns the XML schema&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;System.Runtime.Serialization.CollectionDataContractAttribute&lt;/STRONG&gt; (&lt;STRONG&gt;XmlObjectSerializer&lt;/STRONG&gt;)&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;System.Runtime.Serialization.DataContractAttribute&lt;/STRONG&gt; (&lt;STRONG&gt;XmlObjectSerializer&lt;/STRONG&gt;)&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;System.Runtime.Serialization.DataMemberAttribute&lt;/STRONG&gt; (&lt;STRONG&gt;XmlObjectSerializer&lt;/STRONG&gt;)&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;System.Runtime.Serialization.EnumMemberAttribute&lt;/STRONG&gt; (&lt;STRONG&gt;XmlObjectSerializer&lt;/STRONG&gt;)&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;System.Runtime.Serialization.IgnoreDataMemberAttribute&lt;/STRONG&gt; (&lt;STRONG&gt;XmlObjectSerializer&lt;/STRONG&gt;)&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;System.Runtime.Serialization.&lt;SPAN class=identifier&gt;XmlSerializerFormatAttribute&lt;/SPAN&gt;&lt;/STRONG&gt; (&lt;STRONG&gt;XmlObjectSerializer&lt;/STRONG&gt;): choose&amp;nbsp;&lt;STRONG&gt;XmlSerializer&lt;/STRONG&gt; instead of &lt;STRONG&gt;DataContractSerializer&lt;/STRONG&gt; &lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;Note that the &lt;STRONG&gt;Soap*&lt;/STRONG&gt; attributes are only considered if the &lt;STRONG&gt;SoapBindingUse.Encoded&lt;/STRONG&gt; is set for the &lt;STRONG&gt;Use&lt;/STRONG&gt; property of the binding, in ASP.NET Web Services, otherwise, its the &lt;STRONG&gt;Xml*&lt;/STRONG&gt; attributes.&lt;/P&gt;
&lt;P&gt;It would be good to see a common interface (perhaps &lt;STRONG&gt;IFormatter&lt;/STRONG&gt;, since it's the most common) for all of these serializers.&lt;/FONT&gt;&lt;/P&gt;&lt;A class=addthis_button href="http://www.addthis.com/bookmark.php?v=250&amp;amp;pub=xa-4a96c06008dc31e0" mce_href="http://www.addthis.com/bookmark.php?v=250&amp;amp;pub=xa-4a96c06008dc31e0"&gt;&lt;IMG style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; BORDER-TOP: 0px; BORDER-RIGHT: 0px" alt="Bookmark and Share" src="http://s7.addthis.com/static/btn/v2/lg-share-en.gif" width=125 height=16 mce_src="http://s7.addthis.com/static/btn/v2/lg-share-en.gif"&gt;&lt;/A&gt;
&lt;SCRIPT type=text/javascript src="http://s7.addthis.com/js/250/addthis_widget.js?pub=xa-4a96c06008dc31e0" mce_src="http://s7.addthis.com/js/250/addthis_widget.js?pub=xa-4a96c06008dc31e0"&gt;&lt;/SCRIPT&gt;
 &lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7225394" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/ricardoperes/archive/tags/WCF/default.aspx">WCF</category><category domain="http://weblogs.asp.net/ricardoperes/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/ricardoperes/archive/tags/Serialization/default.aspx">Serialization</category></item><item><title>Generating a Unique Identifier for Each Page Instance</title><link>http://weblogs.asp.net/ricardoperes/archive/2009/10/06/generating-an-identifier-for-each-page-instance.aspx</link><pubDate>Tue, 06 Oct 2009 18:11:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:7224242</guid><dc:creator>Ricardo Peres</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/ricardoperes/rsscomments.aspx?PostID=7224242</wfw:commentRss><comments>http://weblogs.asp.net/ricardoperes/archive/2009/10/06/generating-an-identifier-for-each-page-instance.aspx#comments</comments><description>&lt;P mce_keep="true"&gt;Sometimes there may be a need for identifying each page instance univocally. One ocasion may be, for example, if we want to store something in a session which is specific to a certain page.&lt;/P&gt;
&lt;P mce_keep="true"&gt;What I did was override the &lt;STRONG&gt;Page&lt;/STRONG&gt; class' &lt;STRONG&gt;ID&lt;/STRONG&gt; property and have it return a unique value for a page that is kept throughout all postbacks. Here is my code:&lt;/P&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;public&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;override&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#2b91af size=2&gt;&lt;FONT color=#2b91af size=2&gt;String&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; ID&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; 
&lt;P&gt;{&lt;/P&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; get&lt;/P&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;{&lt;/P&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#2b91af size=2&gt;&lt;FONT color=#2b91af size=2&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;String&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; id = &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;null&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;;&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT color=#000000 size=2&gt; ((&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;this&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT color=#000000 size=2&gt;.IsPostBack == &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;true&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT color=#000000 size=2&gt;) &amp;amp;&amp;amp; (&lt;/FONT&gt;&lt;FONT color=#2b91af size=2&gt;&lt;FONT color=#2b91af size=2&gt;String&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT color=#000000 size=2&gt;.IsNullOrEmpty(&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;this&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT color=#000000 size=2&gt;.Context.Request.Form[&lt;/FONT&gt;&lt;FONT color=#a31515 size=2&gt;&lt;FONT color=#a31515 size=2&gt;"__ID"&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT color=#000000 size=2&gt;]) == &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;false&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT color=#000000&gt;))&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; 
&lt;P&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;{&lt;/P&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;id = &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;this&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;.Context.Request.Form[&lt;/FONT&gt;&lt;FONT color=#a31515 size=2&gt;&lt;FONT color=#a31515 size=2&gt;"__ID"&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;];&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; 
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;}&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;if&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; (&lt;/FONT&gt;&lt;FONT color=#2b91af size=2&gt;&lt;FONT color=#2b91af size=2&gt;String&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;.IsNullOrEmpty(&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;this&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;.Context.Items [ &lt;/FONT&gt;&lt;FONT color=#a31515 size=2&gt;&lt;FONT color=#a31515 size=2&gt;"__ID"&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; ] &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;as&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#2b91af size=2&gt;&lt;FONT color=#2b91af size=2&gt;String&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;) == &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;false&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;)&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; 
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;{&lt;/P&gt;&amp;nbsp;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;id = &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;this&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;.Context.Items [ &lt;/FONT&gt;&lt;FONT color=#a31515 size=2&gt;&lt;FONT color=#a31515 size=2&gt;"__ID"&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; ] &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;as&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#2b91af size=2&gt;&lt;FONT color=#2b91af size=2&gt;String&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; 
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;}&lt;/P&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else&lt;/P&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;{&lt;/P&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;id = &lt;/FONT&gt;&lt;FONT color=#2b91af size=2&gt;&lt;FONT color=#2b91af size=2&gt;Guid&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;.NewGuid().ToString();&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;.Context.Items [ &lt;/FONT&gt;&lt;FONT color=#a31515 size=2&gt;&lt;FONT color=#a31515 size=2&gt;"__ID"&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; ] = id;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; 
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;}&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; (id);&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; 
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;}&lt;/P&gt;
&lt;P&gt;}&lt;/P&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;protected&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;override&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;void&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; OnPreInit(&lt;/FONT&gt;&lt;FONT color=#2b91af size=2&gt;&lt;FONT color=#2b91af size=2&gt;EventArgs&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; e)&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; 
&lt;P&gt;{&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; this&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;.ClientScript.RegisterHiddenField(&lt;/FONT&gt;&lt;FONT color=#a31515 size=2&gt;&lt;FONT color=#a31515 size=2&gt;"__ID"&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;, &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;this&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;.ID);&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; base&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;.OnPreInit(e);&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; 
&lt;P&gt;}&lt;/P&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;A class=addthis_button href="http://www.addthis.com/bookmark.php?v=250&amp;amp;pub=xa-4a96c06008dc31e0" mce_href="http://www.addthis.com/bookmark.php?v=250&amp;amp;pub=xa-4a96c06008dc31e0"&gt;&lt;IMG style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; BORDER-TOP: 0px; BORDER-RIGHT: 0px" alt="Bookmark and Share" src="http://s7.addthis.com/static/btn/v2/lg-share-en.gif" width=125 height=16 mce_src="http://s7.addthis.com/static/btn/v2/lg-share-en.gif"&gt;&lt;/A&gt;
&lt;SCRIPT type=text/javascript src="http://s7.addthis.com/js/250/addthis_widget.js?pub=xa-4a96c06008dc31e0" mce_src="http://s7.addthis.com/js/250/addthis_widget.js?pub=xa-4a96c06008dc31e0"&gt;&lt;/SCRIPT&gt;
 &lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7224242" width="1" height="1"&gt;</description></item><item><title>Custom Binding With EntityDataSource</title><link>http://weblogs.asp.net/ricardoperes/archive/2009/10/06/custom-binding-with-entitydatasource.aspx</link><pubDate>Tue, 06 Oct 2009 14:21:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:7224029</guid><dc:creator>Ricardo Peres</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/ricardoperes/rsscomments.aspx?PostID=7224029</wfw:commentRss><comments>http://weblogs.asp.net/ricardoperes/archive/2009/10/06/custom-binding-with-entitydatasource.aspx#comments</comments><description>&lt;P mce_keep="true"&gt;Here's a common scenario: you are using an &lt;STRONG&gt;EntityDataSource&lt;/STRONG&gt; control which&amp;nbsp;you are binding to a data control, perhaps a &lt;STRONG&gt;ListView&lt;/STRONG&gt;, &lt;STRONG&gt;DataGrid&lt;/STRONG&gt;, &lt;STRONG&gt;DataList&lt;/STRONG&gt;, &lt;STRONG&gt;Repeater&lt;/STRONG&gt;, or &lt;STRONG&gt;GridView&lt;/STRONG&gt;. The problem is, you want to do some custom binding. This happens, for example, when viewing a master-detail relationship.&lt;/P&gt;
&lt;P mce_keep="true"&gt;What you typically do then is implement a custom&amp;nbsp;event handler for event &lt;STRONG&gt;ItemDataBound&lt;/STRONG&gt; (for &lt;STRONG&gt;ListView&lt;/STRONG&gt;, &lt;STRONG&gt;DataGrid&lt;/STRONG&gt;, &lt;STRONG&gt;DataList&lt;/STRONG&gt; and &lt;STRONG&gt;Repeater&lt;/STRONG&gt;) or &lt;STRONG&gt;RowDataBound&lt;/STRONG&gt; (for &lt;STRONG&gt;GridView&lt;/STRONG&gt;) and do something with the &lt;STRONG&gt;e.Item.DataItem&lt;/STRONG&gt; property value (in the former cases)&amp;nbsp;or &lt;STRONG&gt;e.Row.DataItem&lt;/STRONG&gt; (in the later one), which is, of course,&amp;nbsp;a pointer to&amp;nbsp;your entity object... or is it? Depending on the way you've set up &lt;STRONG&gt;EntityDataSource&lt;/STRONG&gt; on your page, it may or may not be.&lt;/P&gt;
&lt;P mce_keep="true"&gt;If you used the &lt;STRONG&gt;EntitySetName&lt;/STRONG&gt; property to indicate the name of your entity, it won't work, because the &lt;STRONG&gt;e.Item.DataItem&lt;/STRONG&gt; (or &lt;STRONG&gt;e.Row.DataItem&lt;/STRONG&gt;) will instead contain a wrapper object:&lt;/P&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;&amp;lt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT color=#a31515 size=2&gt;&lt;FONT color=#a31515 size=2&gt;asp&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;:&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT color=#a31515 size=2&gt;&lt;FONT color=#a31515 size=2&gt;EntityDataSource&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#ff0000 size=2&gt;&lt;FONT color=#ff0000 size=2&gt;ID&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;="myEntitiesDataSource"&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#ff0000 size=2&gt;&lt;FONT color=#ff0000 size=2&gt;runat&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;="server"&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT size=2&gt;&lt;/FONT&gt;&lt;FONT color=#ff0000 size=2&gt;&lt;FONT color=#ff0000 size=2&gt;ConnectionString&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;="name=MyEntities"&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#ff0000 size=2&gt;&lt;FONT color=#ff0000 size=2&gt;EntitySetName&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;="Entity"&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt; 
&lt;P&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;/FONT&gt;&lt;FONT color=#ff0000 size=2&gt;&lt;FONT color=#ff0000 size=2&gt;DefaultContainerName&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;="MyEntities"&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; /&amp;gt;&lt;/FONT&gt;&lt;/P&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;protected&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;void&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; OnItemDataBound(&lt;/FONT&gt;&lt;FONT color=#2b91af size=2&gt;&lt;FONT color=#2b91af size=2&gt;Object&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; sender, &lt;/FONT&gt;&lt;FONT color=#2b91af size=2&gt;&lt;FONT color=#2b91af size=2&gt;RepeaterItemEventArgs&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; e)&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT size=2&gt;
&lt;P&gt;{&lt;/P&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#2b91af size=2&gt;&lt;FONT color=#2b91af size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Entity&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&amp;nbsp;entity = e.Item.DataItem &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;as&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#2b91af size=2&gt;&lt;FONT color=#2b91af size=2&gt;Entity&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;;&amp;nbsp; &lt;FONT color=#008000 size=2&gt;&lt;FONT color=#008000 size=2&gt;//null&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;FONT color=#008000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT size=2&gt;entity = this.GetWrappedEntity&amp;lt;&lt;FONT color=#2b91af&gt;Entity&lt;/FONT&gt;&amp;gt;(e.Item.DataItem);&amp;nbsp; &lt;FONT color=#008000&gt;//see code below&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; 
&lt;P&gt;}&lt;/P&gt;
&lt;P&gt;In this case, you must use&amp;nbsp;this in order to get the actual entity:&amp;nbsp;&lt;/P&gt;&lt;FONT size=2&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;protected&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; TEntity GetWrappedEntity&amp;lt;TEntity&amp;gt;(&lt;/FONT&gt;&lt;FONT color=#2b91af size=2&gt;&lt;FONT color=#2b91af size=2&gt;Object&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; dataItem) &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;where&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; TEntity : &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;class&lt;/P&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;
&lt;P&gt;{&lt;/P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; TEntity entity = dataItem &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;as&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; TEntity;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;if&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; (entity != &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;null&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;)&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; 
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;return&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; (entity);&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; 
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;else&lt;/P&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color=#2b91af size=2&gt;&lt;FONT color=#2b91af size=2&gt;&lt;FONT color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;ICustomTypeDescriptor&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; td = dataItem &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;as&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#2b91af size=2&gt;&lt;FONT color=#2b91af size=2&gt;ICustomTypeDescriptor&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;if&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; (td != &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;null&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;)&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; 
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;return&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; (td.GetPropertyOwner(&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;null&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;) &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;as&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; TEntity);&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; 
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;else&lt;/P&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;return&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; (&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;null&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;);&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; 
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;
&lt;P&gt;}&lt;/P&gt;
&lt;P&gt;&lt;/FONT&gt;If, however, you skip the &lt;STRONG&gt;EntitySetName&lt;/STRONG&gt; property and instead set the &lt;STRONG&gt;CommandText&lt;/STRONG&gt; property, everything works as usual:&lt;/P&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;&amp;lt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT color=#a31515 size=2&gt;&lt;FONT color=#a31515 size=2&gt;asp&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;:&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT color=#a31515 size=2&gt;&lt;FONT color=#a31515 size=2&gt;EntityDataSource&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#ff0000 size=2&gt;&lt;FONT color=#ff0000 size=2&gt;ID&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;="myEntitiesDataSource"&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#ff0000 size=2&gt;&lt;FONT color=#ff0000 size=2&gt;runat&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;="server"&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT size=2&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#ff0000 size=2&gt;&lt;FONT color=#ff0000 size=2&gt;ConnectionString&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;="name=MyEntities"&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#ff0000 size=2&gt;&lt;FONT color=#ff0000 size=2&gt;&lt;FONT color=#ff0000 size=2&gt;&lt;FONT color=#ff0000 size=2&gt;CommandText&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;="SELECT VALUE entity FROM MyEntities.Entities AS entity"&lt;/P&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#ff0000 size=2&gt;&lt;FONT color=#ff0000 size=2&gt;DefaultContainerName&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;="MyEntities"&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; /&amp;gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;protected&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;void&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; OnItemDataBound(&lt;/FONT&gt;&lt;FONT color=#2b91af size=2&gt;&lt;FONT color=#2b91af size=2&gt;Object&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; sender, &lt;/FONT&gt;&lt;FONT color=#2b91af size=2&gt;&lt;FONT color=#2b91af size=2&gt;RepeaterItemEventArgs&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; e)&lt;/FONT&gt;&lt;FONT size=2&gt; 
&lt;P&gt;{&lt;/P&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#2b91af size=2&gt;&lt;FONT color=#2b91af size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Entity&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&amp;nbsp;entity = e.Item.DataItem &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;as&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#2b91af size=2&gt;&lt;FONT color=#2b91af size=2&gt;Entity&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;;&amp;nbsp; &lt;FONT color=#008000 size=2&gt;&lt;FONT color=#008000 size=2&gt;//ok&lt;/P&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;
&lt;P&gt;}&lt;/P&gt;
&lt;P&gt;Hope this saves you some trouble! :-)&lt;/FONT&gt;&lt;/P&gt;&lt;A class=addthis_button href="http://www.addthis.com/bookmark.php?v=250&amp;amp;pub=xa-4a96c06008dc31e0" mce_href="http://www.addthis.com/bookmark.php?v=250&amp;amp;pub=xa-4a96c06008dc31e0"&gt;&lt;IMG style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; BORDER-TOP: 0px; BORDER-RIGHT: 0px" alt="Bookmark and Share" src="http://s7.addthis.com/static/btn/v2/lg-share-en.gif" width=125 height=16 mce_src="http://s7.addthis.com/static/btn/v2/lg-share-en.gif"&gt;&lt;/A&gt;
&lt;SCRIPT type=text/javascript src="http://s7.addthis.com/js/250/addthis_widget.js?pub=xa-4a96c06008dc31e0" mce_src="http://s7.addthis.com/js/250/addthis_widget.js?pub=xa-4a96c06008dc31e0"&gt;&lt;/SCRIPT&gt;
 &lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7224029" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/ricardoperes/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/ricardoperes/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://weblogs.asp.net/ricardoperes/archive/tags/Entity+Framework/default.aspx">Entity Framework</category></item><item><title>New Version of AJAX Control Toolkit Released</title><link>http://weblogs.asp.net/ricardoperes/archive/2009/10/01/new-version-of-ajax-control-toolkit-released-1.aspx</link><pubDate>Thu, 01 Oct 2009 09:02:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:7220859</guid><dc:creator>Ricardo Peres</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/ricardoperes/rsscomments.aspx?PostID=7220859</wfw:commentRss><comments>http://weblogs.asp.net/ricardoperes/archive/2009/10/01/new-version-of-ajax-control-toolkit-released-1.aspx#comments</comments><description>&lt;P mce_keep="true"&gt;Version &lt;SPAN id=ctl00_ctl00_MasterContent_RightSideBar_CurrentRelease_Sidebar_releaseTitleLabel&gt;3.0.30930 is out. &lt;/SPAN&gt;&lt;SPAN&gt;This release includes two new controls: &lt;/SPAN&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;
&lt;DIV mce_keep="true"&gt;&lt;SPAN&gt;Seadragon - Seadragon enables you to pan, zoom, and make an image full screen. You can use it, for example, to display interactive product pictures.&lt;/DIV&gt;&lt;/LI&gt;
&lt;LI&gt;AsyncFileUpload - This new control enables you to perform file uploads without doing a postback. The control displays a throbber image during upload and raises client and server events when the upload is complete. This control was contributed by Steven Lindsay.&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;More than 20 bugs were also fixed.&lt;/SPAN&gt;&lt;SPAN&gt;&amp;nbsp;See them all&amp;nbsp;live&amp;nbsp;at the &lt;A title=Samples href="http://www.asp.net/ajax/ajaxcontroltoolkit/samples/" target=_blank mce_href="http://www.asp.net/ajax/ajaxcontroltoolkit/samples/"&gt;samples&lt;/A&gt; page.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;SPAN&gt;Get it &lt;A title="AJAX Control Toolkit" href="http://ajaxcontroltoolkit.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=33804" target=_blank mce_href="http://ajaxcontroltoolkit.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=33804"&gt;here&lt;/A&gt;. Also check the &lt;A title="Candidate Controls" href="http://ajaxcontroltoolkit.codeplex.com/Wiki/View.aspx?title=CandidateControls" target=_blank mce_href="http://ajaxcontroltoolkit.codeplex.com/Wiki/View.aspx?title=CandidateControls"&gt;candidate controls submitted by the community&lt;/A&gt;.&lt;/SPAN&gt;&lt;/P&gt;&lt;A class=addthis_button href="http://www.addthis.com/bookmark.php?v=250&amp;amp;pub=xa-4a96c06008dc31e0" mce_href="http://www.addthis.com/bookmark.php?v=250&amp;amp;pub=xa-4a96c06008dc31e0"&gt;&lt;IMG style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; BORDER-TOP: 0px; BORDER-RIGHT: 0px" alt="Bookmark and Share" src="http://s7.addthis.com/static/btn/v2/lg-share-en.gif" width=125 height=16 mce_src="http://s7.addthis.com/static/btn/v2/lg-share-en.gif"&gt;&lt;/A&gt;
&lt;SCRIPT type=text/javascript src="http://s7.addthis.com/js/250/addthis_widget.js?pub=xa-4a96c06008dc31e0" mce_src="http://s7.addthis.com/js/250/addthis_widget.js?pub=xa-4a96c06008dc31e0"&gt;&lt;/SCRIPT&gt;
 &lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7220859" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/ricardoperes/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/ricardoperes/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://weblogs.asp.net/ricardoperes/archive/tags/Libraries/default.aspx">Libraries</category></item><item><title>Detecting Chrome Browser in ASP.NET</title><link>http://weblogs.asp.net/ricardoperes/archive/2009/09/22/detecting-chrome-browser-in-asp-net.aspx</link><pubDate>Tue, 22 Sep 2009 17:43:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:7214148</guid><dc:creator>Ricardo Peres</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/ricardoperes/rsscomments.aspx?PostID=7214148</wfw:commentRss><comments>http://weblogs.asp.net/ricardoperes/archive/2009/09/22/detecting-chrome-browser-in-asp-net.aspx#comments</comments><description>&lt;P mce_keep="true"&gt;ASP.NET comes with a&amp;nbsp;browser capabilities database (BCD), which describes the capabilities of known browsers. This database is usefull for control developers that want to take advantage on different browser capabilities. Of course,&amp;nbsp;more recent&amp;nbsp;browsers are not listed on that database, simply because they did not exist at the time ASP.NET 2.0 was released (versions 3.0, 3.5 and 3.5 SP1 don't add anything new), and, specifically, Chrome is not on that list.&lt;/P&gt;
&lt;P mce_keep="true"&gt;If you want to add new browsers to the BCD, you have two options:&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;
&lt;DIV mce_keep="true"&gt;The global database, located in the &lt;STRONG&gt;%Windir%\Microsoft.NET\Framework\v2.0.50727\CONFIG\Browsers&lt;/STRONG&gt; directory&lt;/DIV&gt;&lt;/LI&gt;
&lt;LI&gt;
&lt;DIV mce_keep="true"&gt;A local database on your ASP.NET application, in the &lt;STRONG&gt;App_Browsers&lt;/STRONG&gt; directory&lt;/DIV&gt;&lt;/LI&gt;&lt;/OL&gt;
&lt;P mce_keep="true"&gt;In any case, you start by adding a new file, say, &lt;STRONG&gt;Chrome.browser&lt;/STRONG&gt;, to the appropriate directory. Looking at all browsers registed in the BCD, we choose Safari as the most similar one, and have our definition inherit from it:&lt;/P&gt;&lt;FONT color=#0000ff&gt;&amp;lt;&lt;/FONT&gt;&lt;FONT color=#a31515&gt;browsers&lt;/FONT&gt;&lt;FONT color=#0000ff&gt;&amp;gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff&gt; 
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/FONT&gt;&lt;FONT color=#a31515&gt;browser&lt;/FONT&gt;&lt;FONT color=#0000ff&gt; &lt;/FONT&gt;&lt;FONT color=#ff0000&gt;id&lt;/FONT&gt;&lt;FONT color=#0000ff&gt;=&lt;/FONT&gt;"&lt;FONT color=#0000ff&gt;Chrome&lt;/FONT&gt;"&lt;FONT color=#0000ff&gt; &lt;/FONT&gt;&lt;FONT color=#ff0000&gt;parentID&lt;/FONT&gt;&lt;FONT color=#0000ff&gt;=&lt;/FONT&gt;"&lt;FONT color=#0000ff&gt;Safari1Plus&lt;/FONT&gt;"&lt;FONT color=#0000ff&gt;&amp;gt;&lt;/P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/FONT&gt;&lt;FONT color=#a31515&gt;identification&lt;/FONT&gt;&lt;FONT color=#0000ff&gt;&amp;gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/FONT&gt;&lt;FONT color=#a31515&gt;userAgent&lt;/FONT&gt;&lt;FONT color=#0000ff&gt; &lt;/FONT&gt;&lt;FONT color=#ff0000&gt;match&lt;/FONT&gt;&lt;FONT color=#0000ff&gt;=&lt;/FONT&gt;"&lt;FONT color=#0000ff&gt;Chrome/(?'version'(?'major'\d+)\.(?'minor'\d+\.\d+).\d+)&lt;/FONT&gt;"&lt;FONT color=#0000ff&gt; /&amp;gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff&gt; 
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/&lt;/FONT&gt;&lt;FONT color=#a31515&gt;identification&lt;/FONT&gt;&lt;FONT color=#0000ff&gt;&amp;gt;&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/FONT&gt;&lt;FONT color=#a31515&gt;capabilities&lt;/FONT&gt;&lt;FONT color=#0000ff&gt;&amp;gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff&gt; 
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/FONT&gt;&lt;FONT color=#a31515&gt;capability&lt;/FONT&gt;&lt;FONT color=#0000ff&gt; &lt;/FONT&gt;&lt;FONT color=#ff0000&gt;name&lt;/FONT&gt;&lt;FONT color=#0000ff&gt;=&lt;/FONT&gt;"&lt;FONT color=#0000ff&gt;browser&lt;/FONT&gt;"&lt;FONT color=#0000ff&gt; &lt;/FONT&gt;&lt;FONT color=#ff0000&gt;value&lt;/FONT&gt;&lt;FONT color=#0000ff&gt;=&lt;/FONT&gt;"&lt;FONT color=#0000ff&gt;Chrome&lt;/FONT&gt;"&lt;FONT color=#0000ff&gt; /&amp;gt;&lt;/P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;&lt;/FONT&gt;&lt;FONT color=#a31515&gt;capability&lt;/FONT&gt;&lt;FONT color=#0000ff&gt; &lt;/FONT&gt;&lt;FONT color=#ff0000&gt;name&lt;/FONT&gt;&lt;FONT color=#0000ff&gt;=&lt;/FONT&gt;"&lt;FONT color=#0000ff&gt;majorversion&lt;/FONT&gt;"&lt;FONT color=#0000ff&gt; &lt;/FONT&gt;&lt;FONT color=#ff0000&gt;value&lt;/FONT&gt;&lt;FONT color=#0000ff&gt;=&lt;/FONT&gt;"&lt;FONT color=#0000ff&gt;${major}&lt;/FONT&gt;"&lt;FONT color=#0000ff&gt; /&amp;gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff&gt; 
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/FONT&gt;&lt;FONT color=#a31515&gt;capability&lt;/FONT&gt;&lt;FONT color=#0000ff&gt; &lt;/FONT&gt;&lt;FONT color=#ff0000&gt;name&lt;/FONT&gt;&lt;FONT color=#0000ff&gt;=&lt;/FONT&gt;"&lt;FONT color=#0000ff&gt;minorversion&lt;/FONT&gt;"&lt;FONT color=#0000ff&gt; &lt;/FONT&gt;&lt;FONT color=#ff0000&gt;value&lt;/FONT&gt;&lt;FONT color=#0000ff&gt;=&lt;/FONT&gt;"&lt;FONT color=#0000ff&gt;${minor}&lt;/FONT&gt;"&lt;FONT color=#0000ff&gt; /&amp;gt;&lt;/P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/FONT&gt;&lt;FONT color=#a31515&gt;capability&lt;/FONT&gt;&lt;FONT color=#0000ff&gt; &lt;/FONT&gt;&lt;FONT color=#ff0000&gt;name&lt;/FONT&gt;&lt;FONT color=#0000ff&gt;=&lt;/FONT&gt;"&lt;FONT color=#0000ff&gt;version&lt;/FONT&gt;"&lt;FONT color=#0000ff&gt; &lt;/FONT&gt;&lt;FONT color=#ff0000&gt;value&lt;/FONT&gt;&lt;FONT color=#0000ff&gt;=&lt;/FONT&gt;"&lt;FONT color=#0000ff&gt;${version}&lt;/FONT&gt;"&lt;FONT color=#0000ff&gt; /&amp;gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff&gt; 
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/&lt;/FONT&gt;&lt;FONT color=#a31515&gt;capabilities&lt;/FONT&gt;&lt;FONT color=#0000ff&gt;&amp;gt;&lt;/P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/&lt;/FONT&gt;&lt;FONT color=#a31515&gt;browser&lt;/FONT&gt;&lt;FONT color=#0000ff&gt;&amp;gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff&gt; 
&lt;P&gt;&amp;lt;/&lt;/FONT&gt;&lt;FONT color=#a31515&gt;browsers&lt;/FONT&gt;&lt;FONT color=#0000ff&gt;&amp;gt;&lt;/P&gt;&lt;/FONT&gt;
&lt;P mce_keep="true"&gt;Of&amp;nbsp;course, you&amp;nbsp;can override the capabilities defined for Safari, if you&amp;nbsp;want, but I think they should be&amp;nbsp;OK.&amp;nbsp;Also, you can add entries for all the Chrome versions.&lt;/P&gt;
&lt;P mce_keep="true"&gt;If you try to access your web application running Chrome&amp;nbsp;and look at the &lt;STRONG&gt;HttpContext.Request.Browser.BrowserName&lt;/STRONG&gt;, you may be surprised to see that the name is... not Chrome! It so happens that you must increase the number of characters ASP.NET uses for the user agent header, and you do this in Web.config:&lt;/P&gt;&lt;FONT color=#0000ff&gt;&amp;lt;&lt;/FONT&gt;&lt;FONT color=#a31515&gt;system.web&lt;/FONT&gt;&lt;FONT color=#0000ff&gt;&amp;gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff&gt; 
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/FONT&gt;&lt;FONT color=#a31515&gt;browserCaps&lt;/FONT&gt;&lt;FONT color=#0000ff&gt; &lt;/FONT&gt;&lt;FONT color=#ff0000&gt;userAgentCacheKeyLength&lt;/FONT&gt;&lt;FONT color=#0000ff&gt;=&lt;/FONT&gt;"&lt;FONT color=#0000ff&gt;128&lt;/FONT&gt;"&lt;FONT color=#0000ff&gt; /&amp;gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ...&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&lt;FONT color=#000000&gt;And that's it! If you try now, you'll see that the &lt;STRONG&gt;BrowserName&lt;/STRONG&gt; property is now "Chrome" and that the listed capabilities match the configured ones.&lt;/FONT&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;A class=addthis_button href="http://www.addthis.com/bookmark.php?v=250&amp;amp;pub=xa-4a96c06008dc31e0" mce_href="http://www.addthis.com/bookmark.php?v=250&amp;amp;pub=xa-4a96c06008dc31e0"&gt;&lt;IMG style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; BORDER-TOP: 0px; BORDER-RIGHT: 0px" alt="Bookmark and Share" src="http://s7.addthis.com/static/btn/v2/lg-share-en.gif" width=125 height=16 mce_src="http://s7.addthis.com/static/btn/v2/lg-share-en.gif"&gt;&lt;/A&gt;
&lt;SCRIPT type=text/javascript src="http://s7.addthis.com/js/250/addthis_widget.js?pub=xa-4a96c06008dc31e0" mce_src="http://s7.addthis.com/js/250/addthis_widget.js?pub=xa-4a96c06008dc31e0"&gt;&lt;/SCRIPT&gt;
 &lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7214148" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/ricardoperes/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/ricardoperes/archive/tags/ASP.NET/default.aspx">ASP.NET</category></item><item><title>Data Annotations Property Validator for ASP.NET</title><link>http://weblogs.asp.net/ricardoperes/archive/2009/09/22/data-annotations-property-validator-for-asp-net.aspx</link><pubDate>Tue, 22 Sep 2009 14:34:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:7214035</guid><dc:creator>Ricardo Peres</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/ricardoperes/rsscomments.aspx?PostID=7214035</wfw:commentRss><comments>http://weblogs.asp.net/ricardoperes/archive/2009/09/22/data-annotations-property-validator-for-asp-net.aspx#comments</comments><description>&lt;P mce_keep="true"&gt;Entity Framework, LINQ to SQL and ASP.NET MVC support&amp;nbsp;Microsoft's new validation API, which you can find on&amp;nbsp;&lt;STRONG&gt;System.ComponentModel.DataAnnotations&lt;/STRONG&gt;. It basically consists on attribute classes, inherited from &lt;STRONG&gt;System.ComponentModel.DataAnnotations.ValidationAttribute&lt;/STRONG&gt;. It is very easy to define your own, although Enterprise Library, xVal and Spring.NET validations are considerably power powerfull.&lt;/P&gt;
&lt;P mce_keep="true"&gt;I wanted to have a custom ASP.NET validator that would validate the value of a form control against the validation attributes defined for a given property of a class, in a way similar to the Web&amp;nbsp;Client Software Factory's PropertyProxyValidator, like you can read in &lt;A title="ASP.NET Validation with the Enterprise Library Validation Block" href="http://weblogs.asp.net/ricardoperes/archive/2009/03/11/asp-net-validation-with-the-enterprise-library-validation-block.aspx" target=_blank mce_href="http://weblogs.asp.net/ricardoperes/archive/2009/03/11/asp-net-validation-with-the-enterprise-library-validation-block.aspx"&gt;this&lt;/A&gt; post. This is what I came up with: class &lt;STRONG&gt;DataAnnotationsValidator&lt;/STRONG&gt;!&lt;/P&gt;
&lt;P mce_keep="true"&gt;Here is the code:&lt;/P&gt;&lt;FONT color=#0000ff&gt;
&lt;P&gt;public&lt;/FONT&gt; &lt;FONT color=#0000ff&gt;class&lt;/FONT&gt; &lt;FONT color=#2b91af&gt;DataAnnotationsValidator&lt;/FONT&gt; : &lt;FONT color=#2b91af&gt;BaseValidator&lt;/P&gt;&lt;/FONT&gt;
&lt;P&gt;{&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; protected&lt;/FONT&gt; &lt;FONT color=#0000ff&gt;override&lt;/FONT&gt; &lt;FONT color=#0000ff&gt;void&lt;/FONT&gt; OnInit(&lt;FONT color=#2b91af&gt;EventArgs&lt;/FONT&gt; e)&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;{&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if&lt;/FONT&gt; ((&lt;FONT color=#0000ff&gt;this&lt;/FONT&gt;.Enabled == &lt;FONT color=#0000ff&gt;true&lt;/FONT&gt;) &amp;amp;&amp;amp; (&lt;FONT color=#0000ff&gt;this&lt;/FONT&gt;.Visible == &lt;FONT color=#0000ff&gt;true&lt;/FONT&gt;))&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;{&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this&lt;/FONT&gt;.Page.RegisterRequiresControlState(&lt;FONT color=#0000ff&gt;this&lt;/FONT&gt;);&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;}&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; base&lt;/FONT&gt;.OnInit(e);&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;}&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; protected&lt;/FONT&gt; &lt;FONT color=#0000ff&gt;override&lt;/FONT&gt; &lt;FONT color=#0000ff&gt;void&lt;/FONT&gt; LoadControlState(&lt;FONT color=#2b91af&gt;Object&lt;/FONT&gt; savedState)&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;{&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#2b91af&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;Object&lt;/FONT&gt; [] state = savedState &lt;FONT color=#0000ff&gt;as&lt;/FONT&gt; &lt;FONT color=#2b91af&gt;Object&lt;/FONT&gt; [];&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; base&lt;/FONT&gt;.LoadControlState(state [ 0 ]);&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this&lt;/FONT&gt;.DisplayMode = (&lt;FONT color=#2b91af&gt;ValidationSummaryDisplayMode&lt;/FONT&gt;) state [ 1 ];&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this&lt;/FONT&gt;.PropertyName = (&lt;FONT color=#2b91af&gt;String&lt;/FONT&gt;) state [ 2 ];&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this&lt;/FONT&gt;.SourceTypeName = (&lt;FONT color=#2b91af&gt;String&lt;/FONT&gt;) state [ 3 ];&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;}&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; protected&lt;/FONT&gt; &lt;FONT color=#0000ff&gt;override&lt;/FONT&gt; &lt;FONT color=#2b91af&gt;Object&lt;/FONT&gt; SaveControlState()&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;{&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#2b91af&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;Object&lt;/FONT&gt; [] state = &lt;FONT color=#0000ff&gt;new&lt;/FONT&gt; &lt;FONT color=#2b91af&gt;Object&lt;/FONT&gt; [ 4 ];&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;state [ 0 ] = &lt;FONT color=#0000ff&gt;base&lt;/FONT&gt;.SaveControlState();&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;state [ 1 ] = &lt;FONT color=#0000ff&gt;this&lt;/FONT&gt;.DisplayMode;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;state [ 2 ] = &lt;FONT color=#0000ff&gt;this&lt;/FONT&gt;.PropertyName;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;state [ 3 ] = &lt;FONT color=#0000ff&gt;this&lt;/FONT&gt;.SourceTypeName;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return&lt;/FONT&gt; (state);&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;}&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; protected&lt;/FONT&gt; &lt;FONT color=#0000ff&gt;override&lt;/FONT&gt; &lt;FONT color=#2b91af&gt;Boolean&lt;/FONT&gt; EvaluateIsValid()&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;{&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if&lt;/FONT&gt; ((&lt;FONT color=#2b91af&gt;String&lt;/FONT&gt;.IsNullOrEmpty(&lt;FONT color=#0000ff&gt;this&lt;/FONT&gt;.SourceTypeName) == &lt;FONT color=#0000ff&gt;true&lt;/FONT&gt;) || (&lt;FONT color=#2b91af&gt;String&lt;/FONT&gt;.IsNullOrEmpty(&lt;FONT color=#0000ff&gt;this&lt;/FONT&gt;.PropertyName) == &lt;FONT color=#0000ff&gt;true&lt;/FONT&gt;))&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;{&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return&lt;/FONT&gt; (&lt;FONT color=#0000ff&gt;true&lt;/FONT&gt;);&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;}&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#2b91af&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;Type&lt;/FONT&gt; type = &lt;FONT color=#2b91af&gt;Type&lt;/FONT&gt;.GetType(&lt;FONT color=#0000ff&gt;this&lt;/FONT&gt;.SourceTypeName, &lt;FONT color=#0000ff&gt;false&lt;/FONT&gt;);&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if&lt;/FONT&gt; (type != &lt;FONT color=#0000ff&gt;null&lt;/FONT&gt;)&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;{&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#2b91af&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;PropertyInfo&lt;/FONT&gt; prop = type.GetProperty(&lt;FONT color=#0000ff&gt;this&lt;/FONT&gt;.PropertyName, &lt;FONT color=#2b91af&gt;BindingFlags&lt;/FONT&gt;.Instance | &lt;FONT color=#2b91af&gt;BindingFlags&lt;/FONT&gt;.Public | &lt;FONT color=#2b91af&gt;BindingFlags&lt;/FONT&gt;.GetProperty);&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if&lt;/FONT&gt; (prop != &lt;FONT color=#0000ff&gt;null&lt;/FONT&gt;)&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;{&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#2b91af&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;ValidationAttribute&lt;/FONT&gt; [] attrs = prop.GetCustomAttributes(&lt;FONT color=#0000ff&gt;typeof&lt;/FONT&gt;(&lt;FONT color=#2b91af&gt;ValidationAttribute&lt;/FONT&gt;), &lt;FONT color=#0000ff&gt;true&lt;/FONT&gt;) &lt;FONT color=#0000ff&gt;as&lt;/FONT&gt; &lt;FONT color=#2b91af&gt;ValidationAttribute&lt;/FONT&gt; [];&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#2b91af&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;List&lt;/FONT&gt;&amp;lt;&lt;FONT color=#2b91af&gt;ValidationException&lt;/FONT&gt;&amp;gt; errors = &lt;FONT color=#0000ff&gt;new&lt;/FONT&gt; &lt;FONT color=#2b91af&gt;List&lt;/FONT&gt;&amp;lt;&lt;FONT color=#2b91af&gt;ValidationException&lt;/FONT&gt;&amp;gt;();&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#2b91af&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;String&lt;/FONT&gt; value = &lt;FONT color=#0000ff&gt;this&lt;/FONT&gt;.GetControlValidationValue(&lt;FONT color=#0000ff&gt;this&lt;/FONT&gt;.ControlToValidate);&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if&lt;/FONT&gt; (attrs.Length == 0)&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;{&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#2b91af&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;MetadataTypeAttribute&lt;/FONT&gt; [] metadata = type.GetCustomAttributes(&lt;FONT color=#0000ff&gt;typeof&lt;/FONT&gt;(&lt;FONT color=#2b91af&gt;MetadataTypeAttribute&lt;/FONT&gt;), &lt;FONT color=#0000ff&gt;true&lt;/FONT&gt;) &lt;FONT color=#0000ff&gt;as&lt;/FONT&gt; &lt;FONT color=#2b91af&gt;MetadataTypeAttribute&lt;/FONT&gt; [];&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if&lt;/FONT&gt; (metadata.Length != 0)&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;{&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;prop = metadata[0].MetadataClassType.GetProperty(&lt;FONT color=#0000ff&gt;this&lt;/FONT&gt;.PropertyName, &lt;FONT color=#2b91af&gt;BindingFlags&lt;/FONT&gt;.Instance | &lt;FONT color=#2b91af&gt;BindingFlags&lt;/FONT&gt;.Public | &lt;FONT color=#2b91af&gt;BindingFlags&lt;/FONT&gt;.GetProperty);&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if&lt;/FONT&gt; (prop != &lt;FONT color=#0000ff&gt;null&lt;/FONT&gt;)&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;{&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;attrs = prop.GetCustomAttributes(&lt;FONT color=#0000ff&gt;typeof&lt;/FONT&gt;(&lt;FONT color=#2b91af&gt;ValidationAttribute&lt;/FONT&gt;), &lt;FONT color=#0000ff&gt;true&lt;/FONT&gt;) &lt;FONT color=#0000ff&gt;as&lt;/FONT&gt; &lt;FONT color=#2b91af&gt;ValidationAttribute&lt;/FONT&gt; [];&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;}&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;}&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;}&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for&lt;/FONT&gt; (&lt;FONT color=#2b91af&gt;Int32&lt;/FONT&gt; i = 0; i &amp;lt; attrs.Length; ++i)&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;{&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; try&lt;/P&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;{&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;attrs [ i ].Validate(value, prop.Name);&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;}&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; catch&lt;/FONT&gt; (&lt;FONT color=#2b91af&gt;ValidationException&lt;/FONT&gt; ve)&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;{&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;errors.Add(ve);&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;}&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; catch&lt;/P&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;{&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;}&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;}&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this&lt;/FONT&gt;.ErrorMessage = &lt;FONT color=#0000ff&gt;this&lt;/FONT&gt;.formatErrorMessage(errors);&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return&lt;/FONT&gt; (errors.Count == 0);&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;}&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;}&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this&lt;/FONT&gt;.ErrorMessage = &lt;FONT color=#2b91af&gt;String&lt;/FONT&gt;.Empty;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return&lt;/FONT&gt; (&lt;FONT color=#0000ff&gt;true&lt;/FONT&gt;);&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;}&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private&lt;/FONT&gt; &lt;FONT color=#2b91af&gt;String&lt;/FONT&gt; formatErrorMessage(&lt;FONT color=#2b91af&gt;IList&lt;/FONT&gt;&amp;lt;&lt;FONT color=#2b91af&gt;ValidationException&lt;/FONT&gt;&amp;gt; results)&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;{&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#2b91af&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;String&lt;/FONT&gt; str = &lt;FONT color=#2b91af&gt;String&lt;/FONT&gt;.Empty;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#2b91af&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;String&lt;/FONT&gt; str2 = &lt;FONT color=#2b91af&gt;String&lt;/FONT&gt;.Empty;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#2b91af&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;String&lt;/FONT&gt; str3 = &lt;FONT color=#2b91af&gt;String&lt;/FONT&gt;.Empty;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#2b91af&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;String&lt;/FONT&gt; str4 = &lt;FONT color=#2b91af&gt;String&lt;/FONT&gt;.Empty;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#2b91af&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;StringBuilder&lt;/FONT&gt; builder = &lt;FONT color=#0000ff&gt;new&lt;/FONT&gt; &lt;FONT color=#2b91af&gt;StringBuilder&lt;/FONT&gt;();&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; switch&lt;/FONT&gt; (&lt;FONT color=#0000ff&gt;this&lt;/FONT&gt;.DisplayMode)&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;{&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; case&lt;/FONT&gt; &lt;FONT color=#2b91af&gt;ValidationSummaryDisplayMode&lt;/FONT&gt;.List:&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;str3 = &lt;FONT color=#a31515&gt;"&amp;lt;br/&amp;gt;"&lt;/FONT&gt;;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break&lt;/FONT&gt;;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; case&lt;/FONT&gt; &lt;FONT color=#2b91af&gt;ValidationSummaryDisplayMode&lt;/FONT&gt;.SingleParagraph:&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;str3 = &lt;FONT color=#a31515&gt;" "&lt;/FONT&gt;;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;str4 = &lt;FONT color=#a31515&gt;"&amp;lt;br/&amp;gt;"&lt;/FONT&gt;;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break&lt;/FONT&gt;;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; default&lt;/FONT&gt;:&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;str = &lt;FONT color=#a31515&gt;"&amp;lt;ul&amp;gt;"&lt;/FONT&gt;;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;str2 = &lt;FONT color=#a31515&gt;"&amp;lt;li&amp;gt;"&lt;/FONT&gt;;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;str3 = &lt;FONT color=#a31515&gt;"&amp;lt;/li&amp;gt;"&lt;/FONT&gt;;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;str4 = &lt;FONT color=#a31515&gt;"&amp;lt;/ul&amp;gt;"&lt;/FONT&gt;;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break&lt;/FONT&gt;;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;}&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&lt;/FONT&gt; (results.Count != 0)&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;{&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;builder.Append(str);&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach&lt;/FONT&gt; (&lt;FONT color=#2b91af&gt;ValidationException&lt;/FONT&gt; result &lt;FONT color=#0000ff&gt;in&lt;/FONT&gt; results)&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;{&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;builder.Append(str2);&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;builder.Append(result.Message);&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;builder.Append(str3);&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;}&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;builder.Append(str4);&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;}&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&lt;/FONT&gt; (builder.ToString());&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;}&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;[&lt;FONT color=#2b91af&gt;Browsable&lt;/FONT&gt;(&lt;FONT color=#0000ff&gt;true&lt;/FONT&gt;)]&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;[&lt;FONT color=#2b91af&gt;DefaultValue&lt;/FONT&gt;(&lt;FONT color=#2b91af&gt;ValidationSummaryDisplayMode&lt;/FONT&gt;.List)]&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public&lt;/FONT&gt; &lt;FONT color=#2b91af&gt;ValidationSummaryDisplayMode&lt;/FONT&gt; DisplayMode&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;{&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get&lt;/FONT&gt;;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; set&lt;/FONT&gt;;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;}&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;[&lt;FONT color=#2b91af&gt;Browsable&lt;/FONT&gt;(&lt;FONT color=#0000ff&gt;true&lt;/FONT&gt;)]&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;[&lt;FONT color=#2b91af&gt;DefaultValue&lt;/FONT&gt;(&lt;FONT color=#a31515&gt;""&lt;/FONT&gt;)]&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public&lt;/FONT&gt; &lt;FONT color=#2b91af&gt;String&lt;/FONT&gt; PropertyName&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;{&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get&lt;/FONT&gt;;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; set&lt;/FONT&gt;;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;}&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;[&lt;FONT color=#2b91af&gt;Browsable&lt;/FONT&gt;(&lt;FONT color=#0000ff&gt;true&lt;/FONT&gt;)]&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;[&lt;FONT color=#2b91af&gt;DefaultValue&lt;/FONT&gt;(&lt;FONT color=#a31515&gt;""&lt;/FONT&gt;)]&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public&lt;/FONT&gt; &lt;FONT color=#2b91af&gt;String&lt;/FONT&gt; SourceTypeName&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;{&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get&lt;/FONT&gt;;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; set&lt;/FONT&gt;;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;}&lt;/P&gt;
&lt;P&gt;}&lt;/P&gt;
&lt;P&gt;As you can see, it is smart enough to try to find the validation attributes on a metadata class defined with a &lt;STRONG&gt;MetadataTypeAttribute&lt;/STRONG&gt; attribute, like you would use with generated code, such as Entity Framework's. It also supports all of &lt;STRONG&gt;ValidationSummaryDisplayMode&lt;/STRONG&gt;'s options.&lt;/P&gt;
&lt;P&gt;This is how you would use it:&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;lt;&lt;/FONT&gt;&lt;FONT color=#a31515&gt;asp&lt;/FONT&gt;&lt;FONT color=#0000ff&gt;:&lt;/FONT&gt;&lt;FONT color=#a31515&gt;TextBox&lt;/FONT&gt; &lt;FONT color=#ff0000&gt;runat&lt;/FONT&gt;&lt;FONT color=#0000ff&gt;="server"&lt;/FONT&gt; &lt;FONT color=#ff0000&gt;ID&lt;/FONT&gt;&lt;FONT color=#0000ff&gt;="text"&lt;/FONT&gt; &lt;FONT color=#0000ff&gt;/&amp;gt;&lt;/P&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;lt;&lt;/FONT&gt;&lt;FONT color=#a31515&gt;blog&lt;/FONT&gt;&lt;FONT color=#0000ff&gt;:&lt;/FONT&gt;&lt;FONT color=#a31515&gt;DataAnnotationsValidator&lt;/FONT&gt; &lt;FONT color=#ff0000&gt;runat&lt;/FONT&gt;&lt;FONT color=#0000ff&gt;="server"&lt;/FONT&gt; &lt;FONT color=#ff0000&gt;ControlToValidate&lt;/FONT&gt;&lt;FONT color=#0000ff&gt;="text"&lt;/FONT&gt; &lt;FONT color=#ff0000&gt;SourceTypeName&lt;/FONT&gt;&lt;FONT color=#0000ff&gt;="SomeClass, SomeAssembly"&lt;/FONT&gt; &lt;FONT color=#ff0000&gt;PropertyName&lt;/FONT&gt;&lt;FONT color=#0000ff&gt;="SomeProperty"&lt;/FONT&gt; &lt;FONT color=#0000ff&gt;/&amp;gt;&lt;/P&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;lt;&lt;/FONT&gt;&lt;FONT color=#a31515&gt;asp&lt;/FONT&gt;&lt;FONT color=#0000ff&gt;:&lt;/FONT&gt;&lt;FONT color=#a31515&gt;Button&lt;/FONT&gt; &lt;FONT color=#ff0000&gt;runat&lt;/FONT&gt;&lt;FONT color=#0000ff&gt;="server"&lt;/FONT&gt; &lt;FONT color=#ff0000&gt;Text&lt;/FONT&gt;&lt;FONT color=#0000ff&gt;="Validate"&lt;/FONT&gt; &lt;FONT color=#ff0000&gt;OnClick&lt;/FONT&gt;&lt;FONT color=#0000ff&gt;="OnValidate"&lt;/FONT&gt; &lt;FONT color=#0000ff&gt;/&amp;gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;Suppose the class you want to validate looks like this:&lt;/P&gt;&lt;FONT color=#0000ff&gt;
&lt;P&gt;public&lt;/FONT&gt; &lt;FONT color=#0000ff&gt;class&lt;/FONT&gt; &lt;FONT color=#2b91af&gt;SomeClass&lt;/FONT&gt;&lt;FONT color=#2b91af&gt;&lt;/P&gt;&lt;/FONT&gt;
&lt;P&gt;{&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [&lt;FONT color=#2b91af&gt;Required&lt;/FONT&gt;]&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [&lt;FONT color=#2b91af&gt;RegularExpression&lt;/FONT&gt;(&lt;FONT color=#a31515&gt;@"\d\d\d"&lt;/FONT&gt;)]&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public&lt;/FONT&gt; &lt;FONT color=#2b91af&gt;String&lt;/FONT&gt; SomeProperty&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get&lt;/FONT&gt;;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; set&lt;/FONT&gt;;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;
&lt;P&gt;}&lt;/P&gt;
&lt;P&gt;And that's it! Happy validation!&lt;/P&gt;&lt;A class=addthis_button href="http://www.addthis.com/bookmark.php?v=250&amp;amp;pub=xa-4a96c06008dc31e0" mce_href="http://www.addthis.com/bookmark.php?v=250&amp;amp;pub=xa-4a96c06008dc31e0"&gt;&lt;IMG style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; BORDER-TOP: 0px; BORDER-RIGHT: 0px" alt="Bookmark and Share" src="http://s7.addthis.com/static/btn/v2/lg-share-en.gif" width=125 height=16 mce_src="http://s7.addthis.com/static/btn/v2/lg-share-en.gif"&gt;&lt;/A&gt;
&lt;SCRIPT type=text/javascript src="http://s7.addthis.com/js/250/addthis_widget.js?pub=xa-4a96c06008dc31e0" mce_src="http://s7.addthis.com/js/250/addthis_widget.js?pub=xa-4a96c06008dc31e0"&gt;&lt;/SCRIPT&gt;
 &lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7214035" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/ricardoperes/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/ricardoperes/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://weblogs.asp.net/ricardoperes/archive/tags/Entity+Framework/default.aspx">Entity Framework</category></item></channel></rss>