<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Schotime.net</title>
	
	<link>http://schotime.net/blog</link>
	<description>All Things .Net and Me</description>
	<lastBuildDate>Mon, 03 Aug 2009 15:08:47 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/Schotime" type="application/rss+xml" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><item>
		<title>FluentValidation Xval Integration</title>
		<link>http://feedproxy.google.com/~r/Schotime/~3/StAPu496uLY/</link>
		<comments>http://schotime.net/blog/index.php/2009/06/13/fluentvalidation-xval-integration/#comments</comments>
		<pubDate>Fri, 12 Jun 2009 14:00:00 +0000</pubDate>
		<dc:creator>Schotime</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[ASP.NET MVC]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Fluent Validation]]></category>
		<category><![CDATA[Validation]]></category>
		<category><![CDATA[xVal]]></category>

		<guid isPermaLink="false">http://schotime.net/blog/index.php/2009/06/13/fluentvalidation-xval-integration/</guid>
		<description><![CDATA[After a few months of using FluentValidation I asked its author Jeremy Skinner if it were possible to integrate this with xVal. At that time it was not possible because there were no easy way to access the properties needed by xVal. After submitting a few patches, we now have a solution which enables xVal [...]]]></description>
			<content:encoded><![CDATA[<p>After a few months of using <a href="http://fluentvalidation.codeplex.com" target="_blank" onclick="pageTracker._trackPageview('/outgoing/fluentvalidation.codeplex.com?referer=');">FluentValidation</a> I asked its author Jeremy Skinner if it were possible to integrate this with <a href="http://xval.codeplex.com" target="_blank" onclick="pageTracker._trackPageview('/outgoing/xval.codeplex.com?referer=');">xVal</a>. At that time it was not possible because there were no easy way to access the properties needed by xVal. After submitting a few patches, we now have a solution which enables xVal integration with most of the FV validators.</p>
<p>It currently supports the following FV validatiors:</p>
<ul>
<li>NullValidator </li>
<li>NotEmptyValidator </li>
<li>LengthValidator </li>
<li>RegularExpressionValidator </li>
<li>ComparisonValidator including:
<ul>
<li>Equal </li>
<li>Not Equal </li>
<li>Greater Than or Equal </li>
<li>Less Than or Equal </li>
</ul>
</li>
</ul>
<p>To configure the integration we need to tell xVal to use the FV rules provider rather than the default one. This is done in the global.asax.cs in Application_Start().</p>
<table cellspacing="0" cellpadding="2" width="400" border="1">
<tbody>
<tr>
<td style="background: black" valign="top" width="400">
<pre class="code"><span style="background: black; color: white">xVal.</span><span style="background: black; color: #ffc66d">ActiveRuleProviders</span><span style="background: black; color: white">.Providers.Clear();
xVal.</span><span style="background: black; color: #ffc66d">ActiveRuleProviders</span><span style="background: black; color: white">.Providers.Add(
    </span><span style="background: black; color: #cc7832">new </span><span style="background: black; color: white">FluentValidation.xValIntegration.
            </span><span style="background: black; color: #ffc66d">FluentValidationRulesProvider</span><span style="background: black; color: white">(</span><span style="background: black; color: #cc7832">new </span><span style="background: black; color: #ffc66d">AttributedValidatorFactory</span><span style="background: black; color: white">()));</span></pre>
</td>
</tr>
</tbody>
</table>
<p>The rules provider here is instructed to use the AttributedValidatorFactory to instruct the provider to use the attribute attached to the model class to find the validation class for that model.</p>
<p>Note: This is still new and xVal is still in beta so there may be some issues. If you find any please let me know so we can fix them as soon as possible.</p>
<p>Hopefully once its ready it can be checked in with the other providers at the xVal codeplex site.</p>
<p>This is currently in the development source code which can be downloaded and tried now.</p>
<p>Cheers,</p>
<p>Adam</p>
]]></content:encoded>
			<wfw:commentRss>http://schotime.net/blog/index.php/2009/06/13/fluentvalidation-xval-integration/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://schotime.net/blog/index.php/2009/06/13/fluentvalidation-xval-integration/</feedburner:origLink></item>
		<item>
		<title>Fluent Validation Model Binder – Asp.net MVC</title>
		<link>http://feedproxy.google.com/~r/Schotime/~3/2E8HbGMOlYs/</link>
		<comments>http://schotime.net/blog/index.php/2009/05/11/fluent-validation-model-binder-aspnet-mvc/#comments</comments>
		<pubDate>Mon, 11 May 2009 13:59:00 +0000</pubDate>
		<dc:creator>Schotime</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[ASP.NET MVC]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Fluent Validation]]></category>
		<category><![CDATA[Validation]]></category>

		<guid isPermaLink="false">http://schotime.net/blog/index.php/2009/05/11/fluent-validation-model-binder-aspnet-mvc/</guid>
		<description><![CDATA[A few weeks ago I found the Fluent Validation framework by Jeremy Skinner. I needed to conditionally validate a model depending on an application setting. eg. Description field mandatory / not mandatory depending on the clients business requirements. I loved the simplicity of the framework and the separation from the model it provided.
Since then I [...]]]></description>
			<content:encoded><![CDATA[<p>A few weeks ago I found the <a href="http://fluentvalidation.codeplex.com/" target="_blank" onclick="pageTracker._trackPageview('/outgoing/fluentvalidation.codeplex.com/?referer=');">Fluent Validation</a> framework by <a href="http://www.jeremyskinner.co.uk/" target="_blank" onclick="pageTracker._trackPageview('/outgoing/www.jeremyskinner.co.uk/?referer=');">Jeremy Skinner</a>. I needed to conditionally validate a model depending on an application setting. eg. Description field mandatory / not mandatory depending on the clients business requirements. I loved the simplicity of the framework and the separation from the model it provided.</p>
<p>Since then I have submitted a few patches for the framework, one of which is the Fluent Validation Model binder. Inspired by the Data Annotations Model binder, it works in much the same way. Once you have it set to your default model binder, it will validate any model which contains the specific attribute. This will become clear in the examples below.</p>
<p>Firstly lets take our model.</p>
<table cellspacing="0" cellpadding="2" width="400" border="1">
<tbody>
<tr>
<td style="background: black" valign="top" width="400" code?="code?"><span style="background: black; color: white">           <br /> 
<pre class="code"><span style="background: black; color: white">    [</span><span style="background: black; color: #ffc66d">Validator</span><span style="background: black; color: white">(</span><span style="background: black; color: #cc7832">typeof</span><span style="background: black; color: white">(</span><span style="background: black; color: #ffc66d">LineItemValidator</span><span style="background: black; color: white">))]
    </span><span style="background: black; color: #cc7832">public class </span><span style="background: black; color: #ffc66d">LineItem
    </span><span style="background: black; color: white">{
        </span><span style="background: black; color: #cc7832">public int </span><span style="background: black; color: white">LineNumber { </span><span style="background: black; color: #cc7832">get</span><span style="background: black; color: white">; </span><span style="background: black; color: #cc7832">set</span><span style="background: black; color: white">; }
        </span><span style="background: black; color: #cc7832">public </span><span style="background: black; color: #6897bb">DateTime </span><span style="background: black; color: white">Date { </span><span style="background: black; color: #cc7832">get</span><span style="background: black; color: white">; </span><span style="background: black; color: #cc7832">set</span><span style="background: black; color: white">; }
        </span><span style="background: black; color: #cc7832">public string </span><span style="background: black; color: white">Description { </span><span style="background: black; color: #cc7832">get</span><span style="background: black; color: white">; </span><span style="background: black; color: #cc7832">set</span><span style="background: black; color: white">; }
        </span><span style="background: black; color: #cc7832">public decimal </span><span style="background: black; color: white">Net { </span><span style="background: black; color: #cc7832">get</span><span style="background: black; color: white">; </span><span style="background: black; color: #cc7832">set</span><span style="background: black; color: white">; }
        </span><span style="background: black; color: #cc7832">public decimal </span><span style="background: black; color: white">Tax { </span><span style="background: black; color: #cc7832">get</span><span style="background: black; color: white">; </span><span style="background: black; color: #cc7832">set</span><span style="background: black; color: white">; }
        </span><span style="background: black; color: #cc7832">public decimal </span><span style="background: black; color: white">Gross { </span><span style="background: black; color: #cc7832">get</span><span style="background: black; color: white">; </span><span style="background: black; color: #cc7832">set</span><span style="background: black; color: white">; }
    }</span></pre>
<p>          <a href="http://11011.net/software/vspaste" onclick="pageTracker._trackPageview('/outgoing/11011.net/software/vspaste?referer=');"></a></p>
<p></span></td>
</tr>
</tbody>
</table>
<p>Attached to this simple LineItem class is a Validator attribute. This attribute is used by the Model Binder to locate the Class used for validation. Below I will define my LineItemValidator class which will hold the rules for the validation.</p>
<table cellspacing="0" cellpadding="2" width="400" border="1">
<tbody>
<tr>
<td style="background: black" valign="top" width="400" code?="code?">
<pre><span style="background: black; color: white">    </span><span style="background: black; color: #cc7832">public class </span><span style="background: black; color: #ffc66d">LineItemValidator </span><span style="background: black; color: white">: </span><span style="background: black; color: #ffc66d">AbstractValidator</span><span style="background: black; color: white">&lt;</span><span style="background: black; color: #ffc66d">LineItem</span><span style="background: black; color: white">&gt;
    {
        </span><span style="background: black; color: #cc7832">public </span><span style="background: black; color: white">LineItemValidator()
        {
            RuleFor(x =&gt; x.Description)
                .NotEmpty().When(x =&gt; </span><span style="background: black; color: #ffc66d">Settings</span><span style="background: black; color: white">.DescriptionRequired)
                .And
                .Length(</span><span style="background: black; color: #6897bb">0</span><span style="background: black; color: white">, </span><span style="background: black; color: #6897bb">30</span><span style="background: black; color: white">);

            RuleFor(x =&gt; x.Date)
                .GreaterThanOrEqualTo(</span><span style="background: black; color: #6897bb">DateTime</span><span style="background: black; color: white">.Today);

            RuleFor(x =&gt; x.Net)
                .GreaterThan(</span><span style="background: black; color: #6897bb">0</span><span style="background: black; color: white">);

            RuleFor(x =&gt; x.Gross)
                .GreaterThan(</span><span style="background: black; color: #6897bb">0</span><span style="background: black; color: white">)
                .And
                .Equal(y =&gt; (y.Net + y.Tax))
                .WithName(</span><span style="background: black; color: #a5c25c">&quot;Total Amount&quot;</span><span style="background: black; color: white">);
        }
    }</span></pre>
<p>        <a href="http://11011.net/software/vspaste" onclick="pageTracker._trackPageview('/outgoing/11011.net/software/vspaste?referer=');"></a></td>
</tr>
</tbody>
</table>
<p>As you can see the class must inherit from AbstractValidator&lt;T&gt; where T is the model you want to define the rules for. The first rule uses the conditional When clause where it will only validate that the field is NotEmpty when the Settings.DescriptionRequired boolean is true. Also, another thing is the complex validation taking place on the Gross field. Not only does it validate that it is greater than 0, but that the value is equal to the net + tax amount. This is very elegant indeed. I have also specified the ‘WithName’ clause which has also been integrated into the model binder so that if an error occurs with the gross field, the WithName value will be displayed when an error happens. This is extremely handy for language localization or when the name of the field on the Model is insufficient. </p>
<p>Wiring this Model binder up in the Application_start event in the global.asax.cs is as easy as this.</p>
<table cellspacing="0" cellpadding="2" width="400" border="1">
<tbody>
<tr>
<td style="background: black" valign="top" width="400" code?="code?">
<pre><span style="background: black; color: white">     </span><span style="background: black; color: #ffc66d">ModelBinders</span><span style="background: black; color: white">.Binders.DefaultBinder =
                </span><span style="background: black; color: #cc7832">new </span><span style="background: black; color: #ffc66d">FluentValidationModelBinder</span><span style="background: black; color: white">(</span><span style="background: black; color: #cc7832">new </span><span style="background: black; color: #ffc66d">AttributedValidatorFactory</span><span style="background: black; color: white">());</span></pre>
</td>
</tr>
</tbody>
</table>
<p>Note that we have to pass an instance of the AttributedValidatoryFactory into the Model Binder. This means if you have an alternate way of locating the Validator class other than via the attribute you can inherit from IValidatorFactory and create your own.</p>
<p>Now when a parameter of LineItem gets passed into a controller it will be validated against the model and all errors placed into the ModelState. This can then check the isValid property to determine if there are any errors and proceed accordingly.</p>
<table cellspacing="0" cellpadding="2" width="400" border="1">
<tbody>
<tr>
<td style="background: black" valign="top" width="400"><span style="background: black; color: white"><br />
          </p>
<pre class="code"><span style="background: black; color: white">        [</span><span style="background: black; color: #ffc66d">AcceptVerbs</span><span style="background: black; color: white">(</span><span style="background: black; color: #6897bb">HttpVerbs</span><span style="background: black; color: white">.Post)]
        </span><span style="background: black; color: #cc7832">public </span><span style="background: black; color: #ffc66d">ActionResult </span><span style="background: black; color: white">Edit(</span><span style="background: black; color: #ffc66d">List</span><span style="background: black; color: white">&lt;</span><span style="background: black; color: #ffc66d">LineItem</span><span style="background: black; color: white">&gt; lineItems)
        {
            </span><span style="background: black; color: #cc7832">if </span><span style="background: black; color: white">(ModelState.IsValid)
                </span><span style="background: black; color: #cc7832">return </span><span style="background: black; color: white">RedirectToAction(</span><span style="background: black; color: #a5c25c">&quot;Edit&quot;</span><span style="background: black; color: white">);

            </span><span style="background: black; color: #cc7832">return </span><span style="background: black; color: white">View();
        }</span></pre>
<p>        </span></td>
</tr>
</tbody>
</table>
<p>And that’s it. I hope you enjoy using the Fluent Validation framework as much as I have and happy coding. For all you guys waiting for xVal integration, I will try and post a solution in the coming week. </p>
</p>
<p>Adam
  </p>
]]></content:encoded>
			<wfw:commentRss>http://schotime.net/blog/index.php/2009/05/11/fluent-validation-model-binder-aspnet-mvc/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://schotime.net/blog/index.php/2009/05/11/fluent-validation-model-binder-aspnet-mvc/</feedburner:origLink></item>
		<item>
		<title>Integrating xVal Validation with Linq-to-Sql</title>
		<link>http://feedproxy.google.com/~r/Schotime/~3/nvsdv31-kq4/</link>
		<comments>http://schotime.net/blog/index.php/2009/03/31/integrating-xval-validation-with-linq-to-sql/#comments</comments>
		<pubDate>Tue, 31 Mar 2009 13:58:00 +0000</pubDate>
		<dc:creator>Schotime</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[MVC]]></category>
		<category><![CDATA[Validation]]></category>
		<category><![CDATA[xVal]]></category>

		<guid isPermaLink="false">http://schotime.net/blog/index.php/2009/03/31/integrating-xval-validation-with-linq-to-sql/</guid>
		<description><![CDATA[In a previous post I showed you how you can use xVal and the IDataErrorInfo class to add validation to your Asp.net MVC website. In this post I will extend that to Linq-to-Sql and the classes it generates.
The northwind database has a suppliers table. The info contained below is using that table with linq-to-sql. 
After [...]]]></description>
			<content:encoded><![CDATA[<p>In a previous <a href="http://schotime.net/blog/index.php/2009/03/05/validation-with-aspnet-mvc-xval-idataerrorinfo/">post</a> I showed you how you can use xVal and the IDataErrorInfo class to add validation to your Asp.net MVC website. In this post I will extend that to Linq-to-Sql and the classes it generates.</p>
<p>The northwind database has a suppliers table. The info contained below is using that table with linq-to-sql. </p>
<p>After adding the table to the designer, a Supplier class gets constructed in the background. This class is a partial class which means we can add to it without changing the code auto-generated in the designer.cs file.</p>
<p>We can then create a partial class called Supplier inheriting from Custom Validation and add a MetadataType attribute to it. This attribute specifies the class for which use for validating the Supplier class.</p>
<table cellspacing="0" cellpadding="2" width="400" border="1">
<tbody>
<tr>
<td style="background: black" valign="top" width="400">
<pre class="code"><span style="background: black; color: white">    [</span><span style="background: black; color: #ffc66d">MetadataType</span><span style="background: black; color: white">(</span><span style="background: black; color: #cc7832">typeof</span><span style="background: black; color: white">(</span><span style="background: black; color: #ffc66d">SupplierValidation</span><span style="background: black; color: white">))]
</span><span style="background: black; color: #cc7832">    public partial class </span><span style="background: black; color: #ffc66d">Supplier</span><span style="background: black; color: white"> : </span><span style="background: black; color: #ffc66d">CustomValidation</span><span style="background: black; color: #ffc66d">
</span><span style="background: black; color: white">    {
    }</span></pre>
</td>
</tr>
</tbody>
</table>
<p>We can then create the SupplierValidation class specifying the properties of the Supplier class we would like to be validated. For instance here I only want to validate the ContactName and the ContactTitle of the Supplier.</p>
<table cellspacing="0" cellpadding="2" width="400" border="1">
<tbody>
<tr>
<td style="background: black" valign="top" width="400">
<pre class="code"><span style="background: black; color: white">    </span><span style="background: black; color: #cc7832">    public class </span><span style="background: black; color: #ffc66d">SupplierValidation
    </span><span style="background: black; color: white">{
        [</span><span style="background: black; color: #ffc66d">Required</span><span style="background: black; color: white">]
        </span><span style="background: black; color: #cc7832">public string </span><span style="background: black; color: white">ContactName { </span><span style="background: black; color: #cc7832">get</span><span style="background: black; color: white">; </span><span style="background: black; color: #cc7832">set</span><span style="background: black; color: white">; }

        [</span><span style="background: black; color: #ffc66d">Required</span><span style="background: black; color: white">, </span><span style="background: black; color: #ffc66d">Range</span><span style="background: black; color: white">(</span><span style="background: black; color: #6897bb">0</span><span style="background: black; color: white">, </span><span style="background: black; color: #6897bb">10</span><span style="background: black; color: white">)]
        </span><span style="background: black; color: #cc7832">public string </span><span style="background: black; color: white">ContactTitle { </span><span style="background: black; color: #cc7832">get</span><span style="background: black; color: white">; </span><span style="background: black; color: #cc7832">set</span><span style="background: black; color: white">; }
    }</span></pre>
</td>
</tr>
</tbody>
</table>
<p>This specifies that both fields are required and that the ContactTitle cannot be more than 10 characters in length. </p>
<p>The other benefit of using the buddy class here is that if you need to regenerate a table in the linq-to-sql designer, you won’t lose your changes because they’re contained in a separate file.</p>
<p>From here when a Supplier gets passed to in as a parameter on a Controller action it will be validated using the rules in the Supplier Validation class. </p>
<p>Cheers,<br />
  <br />Adam</p>
]]></content:encoded>
			<wfw:commentRss>http://schotime.net/blog/index.php/2009/03/31/integrating-xval-validation-with-linq-to-sql/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://schotime.net/blog/index.php/2009/03/31/integrating-xval-validation-with-linq-to-sql/</feedburner:origLink></item>
		<item>
		<title>Custom Validation Attributes</title>
		<link>http://feedproxy.google.com/~r/Schotime/~3/o5cxjSX2LxE/</link>
		<comments>http://schotime.net/blog/index.php/2009/03/11/custom-validation-attributes/#comments</comments>
		<pubDate>Wed, 11 Mar 2009 13:57:00 +0000</pubDate>
		<dc:creator>Schotime</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[c# mvc validation asp.net]]></category>

		<guid isPermaLink="false">http://schotime.net/blog/index.php/2009/03/11/custom-validation-attributes/</guid>
		<description><![CDATA[In my last post I showed you how to use Validation attributes on your model for validation. Today I will show how you can create your own attributes that can provide custom validation for you.    
To accomplish this we need to inherit from ValidationAttribute. We&#8217;ll create an attribute today that will only [...]]]></description>
			<content:encoded><![CDATA[<p>In my last <a href="http://schotime.net/blog/index.php/2009/03/05/validation-with-aspnet-mvc-xval-idataerrorinfo/">post</a> I showed you how to use Validation attributes on your model for validation. Today I will show how you can create your own attributes that can provide custom validation for you.    </p>
<p>To accomplish this we need to inherit from ValidationAttribute. We&#8217;ll create an attribute today that will only allow a &quot;Yes&quot; or &quot;No&quot; value to be entered. A pretty bad example however it will still suffice.</p>
<table cellspacing="0" cellpadding="2" width="400" border="1">
<tbody>
<tr>
<td style="background: black" valign="top" width="400"> 
<pre class="code"><span style="background: black; color: #cc7832">public class </span><span style="background: black; color: #ffc66d">TwoValueAttribute </span><span style="background: black; color: white">: </span><span style="background: black; color: #ffc66d">ValidationAttribute
</span><span style="background: black; color: white">{
    </span><span style="background: black; color: #cc7832">private string </span><span style="background: black; color: white">str1 { </span><span style="background: black; color: #cc7832">get</span><span style="background: black; color: white">; </span><span style="background: black; color: #cc7832">set</span><span style="background: black; color: white">; }
    </span><span style="background: black; color: #cc7832">private string </span><span style="background: black; color: white">str2 { </span><span style="background: black; color: #cc7832">get</span><span style="background: black; color: white">; </span><span style="background: black; color: #cc7832">set</span><span style="background: black; color: white">; }

    </span><span style="background: black; color: #cc7832">public </span><span style="background: black; color: white">TwoValueAttribute(</span><span style="background: black; color: #cc7832">string </span><span style="background: black; color: white">str1, </span><span style="background: black; color: #cc7832">string </span><span style="background: black; color: white">str2)
    {
        </span><span style="background: black; color: #cc7832">this</span><span style="background: black; color: white">.str1 = str1;
        </span><span style="background: black; color: #cc7832">this</span><span style="background: black; color: white">.str2 = str2;
    }

    </span><span style="background: black; color: #cc7832">public override bool </span><span style="background: black; color: white">IsValid(</span><span style="background: black; color: #cc7832">object </span><span style="background: black; color: white">value)
    {
        </span><span style="background: black; color: #cc7832">if </span><span style="background: black; color: white">(value.ToString() == str1 || value.ToString() == str2)
            </span><span style="background: black; color: #cc7832">return true</span><span style="background: black; color: white">;
        </span><span style="background: black; color: #cc7832">else
            return false</span><span style="background: black; color: white">;
    }

    </span><span style="background: black; color: #cc7832">public override string </span><span style="background: black; color: white">FormatErrorMessage(</span><span style="background: black; color: #cc7832">string </span><span style="background: black; color: white">name)
    {
        </span><span style="background: black; color: #cc7832">return string</span><span style="background: black; color: white">.Format(</span><span style="background: black; color: #ffc66d">CultureInfo</span><span style="background: black; color: white">.CurrentCulture,
                             </span><span style="background: black; color: #cc7832">base</span><span style="background: black; color: white">.ErrorMessageString,
                             </span><span style="background: black; color: white">name, </span><span style="background: black; color: #cc7832">this</span><span style="background: black; color: white">.str1, </span><span style="background: black; color: #cc7832">this</span><span style="background: black; color: white">.str2);
    }
}</span></pre>
</td>
</tr>
</tbody>
</table>
<p>All the validation logic takes place in the IsValid function. You can override the FormatErrorMessage function so that you can supply a custom error message for each instance that you want to validate if you so wish.</p>
<p>I&#8217;ll show you what I mean.</p>
<table cellspacing="0" cellpadding="2" width="400" border="1">
<tbody>
<tr>
<td style="background: black" valign="top" width="400">
        </p>
<pre class="code"><span style="background: black; color: #cc7832">public class </span><span style="background: black; color: #ffc66d">MyOrder </span><span style="background: black; color: white">: </span><span style="background: black; color: #ffc66d">CustomValidation
</span><span style="background: black; color: white">{
    [</span><span style="background: black; color: #ffc66d">TwoValue</span><span style="background: black; color: white">(</span><span style="background: black; color: #a5c25c">&quot;Yes&quot;</span><span style="background: black; color: white">,</span><span style="background: black; color: #a5c25c">&quot;No&quot;</span><span style="background: black; color: white">,
        ErrorMessage=</span><span style="background: black; color: #a5c25c">&quot;Only the values '{1}' and '{1}' are possible&quot;
                </span><span style="background: black; color: white">+ </span><span style="background: black; color: #a5c25c">&quot; for the {0} field&quot;</span><span style="background: black; color: white">)]
    </span><span style="background: black; color: #cc7832">public string </span><span style="background: black; color: white">Value1 { </span><span style="background: black; color: #cc7832">get</span><span style="background: black; color: white">; </span><span style="background: black; color: #cc7832">set</span><span style="background: black; color: white">; }

    [</span><span style="background: black; color: #ffc66d">TwoValue</span><span style="background: black; color: white">(</span><span style="background: black; color: #a5c25c">&quot;Yes&quot;</span><span style="background: black; color: white">, </span><span style="background: black; color: #a5c25c">&quot;No&quot;</span><span style="background: black; color: white">)]
    </span><span style="background: black; color: #cc7832">public string </span><span style="background: black; color: white">Value2 { </span><span style="background: black; color: #cc7832">get</span><span style="background: black; color: white">; </span><span style="background: black; color: #cc7832">set</span><span style="background: black; color: white">; }
}</span></pre>
</td>
</tr>
</tbody>
</table>
<p>
  <br />Value2 in the above case will give you the default error message if the value is not &quot;Yes&quot; or &quot;No&quot;. However if Value1 is not &quot;Yes&quot; or &quot;No&quot; then the error message supplied will be used and the tokens replaced by the value entered, and the two values used for validation.</p>
<p>And that&#8217;s it. Pretty simple really.<br />
  <br />Cheers,</p>
<p>Adam</p>
]]></content:encoded>
			<wfw:commentRss>http://schotime.net/blog/index.php/2009/03/11/custom-validation-attributes/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://schotime.net/blog/index.php/2009/03/11/custom-validation-attributes/</feedburner:origLink></item>
		<item>
		<title>Validation with Asp.net MVC, xVal &amp; IDataerrorInfo</title>
		<link>http://feedproxy.google.com/~r/Schotime/~3/2sGGZ5dvqm0/</link>
		<comments>http://schotime.net/blog/index.php/2009/03/05/validation-with-aspnet-mvc-xval-idataerrorinfo/#comments</comments>
		<pubDate>Thu, 05 Mar 2009 11:46:07 +0000</pubDate>
		<dc:creator>Schotime</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[C# MVC Asp.net Validation]]></category>

		<guid isPermaLink="false">http://schotime.net/blog/index.php/2009/03/05/validation-with-aspnet-mvc-xval-idataerrorinfo/</guid>
		<description><![CDATA[I&#8217;ve been playing around with lots of different Validation concepts recently and I think I have come up with something that will be very useful. Hopefully you will also find it useful.
Firstly I have been looking at Steve Sanderson&#8217;s new open source project xVal and decided that it was a good place to start. I [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been playing around with lots of different Validation concepts recently and I think I have come up with something that will be very useful. Hopefully you will also find it useful.</p>
<p>Firstly I have been looking at <a href="http://blog.codeville.net/2009/02/27/xval-08-beta-now-released/" target="_blank" onclick="pageTracker._trackPageview('/outgoing/blog.codeville.net/2009/02/27/xval-08-beta-now-released/?referer=');">Steve Sanderson</a>&#8217;s new open source project <a href="http://www.codeplex.com/xval" target="_blank" onclick="pageTracker._trackPageview('/outgoing/www.codeplex.com/xval?referer=');">xVal</a> and decided that it was a good place to start. I was mainly looking at server side validation but <a href="http://www.codeplex.com/xval" target="_blank" onclick="pageTracker._trackPageview('/outgoing/www.codeplex.com/xval?referer=');">xVal</a> can also generate script to enable client side validation.</p>
<p>Firstly I&#8217;ll show you how I integrated the DataAnnotations validation pack that Dynamic data uses and is available to us in 3.5sp1 as far as I know.</p>
<table cellspacing="0" cellpadding="2" width="400" border="1">
<tbody>
<tr>
<td style="background: black" valign="top" width="400">
<pre class="code"><span style="background: black; color: #cc7832">public class </span><span style="background: black; color: #ffc66d">CustomValidation </span><span style="background: black; color: white">: </span><span style="background: black; color: #6897bb">IDataErrorInfo
</span><span style="background: black; color: white">{
    </span><span style="background: black; color: #cc7832">string </span><span style="background: black; color: #6897bb">IDataErrorInfo</span><span style="background: black; color: white">.Error
    {
        </span><span style="background: black; color: #cc7832">get
        </span><span style="background: black; color: white">{
            </span><span style="background: black; color: #cc7832">return string</span><span style="background: black; color: white">.Empty;
        }
    }

    </span><span style="background: black; color: #cc7832">string </span><span style="background: black; color: #6897bb">IDataErrorInfo</span><span style="background: black; color: white">.</span><span style="background: black; color: #cc7832">this</span><span style="background: black; color: white">[</span><span style="background: black; color: #cc7832">string </span><span style="background: black; color: white">columnName]
    {
        </span><span style="background: black; color: #cc7832">get
        </span><span style="background: black; color: white">{
            </span><span style="background: black; color: #ffc66d">List</span><span style="background: black; color: white">&lt;</span><span style="background: black; color: #ffc66d">ErrorInfo</span><span style="background: black; color: white">&gt; errors =
                </span><span style="background: black; color: #ffc66d">DataAnnotations</span><span style="background: black; color: white">.GetErrors(</span><span style="background: black; color: #cc7832">this</span><span style="background: black; color: white">, columnName).ToList();
            </span><span style="background: black; color: #cc7832">return </span><span style="background: black; color: white">errors.Count &gt; </span><span style="background: black; color: #6897bb">0 </span><span style="background: black; color: white">? errors[</span><span style="background: black; color: #6897bb">0</span><span style="background: black; color: white">].ErrorMessage : </span><span style="background: black; color: #cc7832">null</span><span style="background: black; color: white">;
        }
    }
}</span></pre>
</td>
</tr>
</tbody>
</table>
<p>So I first created a class called CustomValidation that implements the IDataErrorInfo interface. From here only two Properties need to be set, the second one being the most important. Here I use the get property accessor to check the errors for each column and if there are errors I return the error message for the first error.</p>
<p>From here we need our Model that we want validated to inherit from this class as follows.</p>
<table cellspacing="0" cellpadding="2" width="400" border="1">
<tbody>
<tr>
<td style="background: black" valign="top" width="400">
<pre class="code"><span style="background: black; color: white">    </span><span style="background: black; color: #cc7832">public class </span><span style="background: black; color: #ffc66d">MyProduct </span><span style="background: black; color: white">: </span><span style="background: black; color: #ffc66d">CustomValidation
    </span><span style="background: black; color: white">{
        [</span><span style="background: black; color: #ffc66d">Range</span><span style="background: black; color: white">(</span><span style="background: black; color: #6897bb">0</span><span style="background: black; color: white">, </span><span style="background: black; color: #6897bb">100</span><span style="background: black; color: white">, ErrorMessage=</span><span style="background: black; color: #a5c25c">"{0} must be set between {1} and {2}"</span><span style="background: black; color: white">)]
        </span><span style="background: black; color: #cc7832">public double</span><span style="background: black; color: white">? UnitPrice { </span><span style="background: black; color: #cc7832">get</span><span style="background: black; color: white">; </span><span style="background: black; color: #cc7832">set</span><span style="background: black; color: white">; }

        [</span><span style="background: black; color: #ffc66d">StringLength</span><span style="background: black; color: white">(</span><span style="background: black; color: #6897bb">30</span><span style="background: black; color: white">)]
        </span><span style="background: black; color: #cc7832">public string </span><span style="background: black; color: white">ProductName { </span><span style="background: black; color: #cc7832">get</span><span style="background: black; color: white">; </span><span style="background: black; color: #cc7832">set</span><span style="background: black; color: white">; }

        </span><span style="background: black; color: #cc7832">public </span><span style="background: black; color: #ffc66d">List</span><span style="background: black; color: white">&lt;</span><span style="background: black; color: #ffc66d">MyOrder</span><span style="background: black; color: white">&gt; Orders { </span><span style="background: black; color: #cc7832">get</span><span style="background: black; color: white">; </span><span style="background: black; color: #cc7832">set</span><span style="background: black; color: white">; }
    }

    </span><span style="background: black; color: #cc7832">public class </span><span style="background: black; color: #ffc66d">MyOrder </span><span style="background: black; color: white">: </span><span style="background: black; color: #ffc66d">CustomValidation
    </span><span style="background: black; color: white">{
        [</span><span style="background: black; color: #ffc66d">Required</span><span style="background: black; color: white">]
        </span><span style="background: black; color: #cc7832">public string </span><span style="background: black; color: white">Name { </span><span style="background: black; color: #cc7832">get</span><span style="background: black; color: white">; </span><span style="background: black; color: #cc7832">set</span><span style="background: black; color: white">; }
    }</span></pre>
</td>
</tr>
</tbody>
</table>
<p>We can then attach Validation attributes. <strong>note:</strong> you will need to add a reference to the System.ComponentModel.DataAnnotations assembly for these attributes to show up.</p>
<p>Once we have these two things setup we can start using it. Actually before I start I will show you the DataAnnotations.GetErrors methods.</p>
<table cellspacing="0" cellpadding="2" width="400" border="1">
<tbody>
<tr>
<td style="background: black" valign="top" width="400">
<pre class="code"><span style="background: black; color: #cc7832">public static class </span><span style="background: black; color: #ffc66d">DataAnnotations
</span><span style="background: black; color: white">{
    </span><span style="background: black; color: #cc7832">public static </span><span style="background: black; color: #6897bb">IEnumerable</span><span style="background: black; color: white">&lt;</span><span style="background: black; color: #ffc66d">ErrorInfo</span><span style="background: black; color: white">&gt; GetErrors(</span><span style="background: black; color: #cc7832">object </span><span style="background: black; color: white">instance)
    {
        </span><span style="background: black; color: #cc7832">return </span><span style="background: black; color: white">GetErrors(instance, </span><span style="background: black; color: #cc7832">null</span><span style="background: black; color: white">);
    }

    </span><span style="background: black; color: #cc7832">public static </span><span style="background: black; color: #6897bb">IEnumerable</span><span style="background: black; color: white">&lt;</span><span style="background: black; color: #ffc66d">ErrorInfo</span><span style="background: black; color: white">&gt; GetErrors(</span><span style="background: black; color: #cc7832">object </span><span style="background: black; color: white">instance, </span><span style="background: black; color: #cc7832">string </span><span style="background: black; color: white">name)
    {
        </span><span style="background: black; color: #cc7832">var </span><span style="background: black; color: white">metadataAttrib = instance.GetType()
                .GetCustomAttributes(</span><span style="background: black; color: #cc7832">typeof</span><span style="background: black; color: white">(</span><span style="background: black; color: #ffc66d">MetadataTypeAttribute</span><span style="background: black; color: white">), </span><span style="background: black; color: #cc7832">true</span><span style="background: black; color: white">)
                .OfType&lt;</span><span style="background: black; color: #ffc66d">MetadataTypeAttribute</span><span style="background: black; color: white">&gt;().FirstOrDefault();
        </span><span style="background: black; color: #cc7832">var </span><span style="background: black; color: white">buddyClassOrModelClass = metadataAttrib != </span><span style="background: black; color: #cc7832">null
                </span><span style="background: black; color: white">? metadataAttrib.MetadataClassType
                : instance.GetType();
        </span><span style="background: black; color: #cc7832">var </span><span style="background: black; color: white">buddyClassProperties = </span><span style="background: black; color: #ffc66d">TypeDescriptor</span><span style="background: black; color: white">.GetProperties(buddyClassOrModelClass)
            .Cast&lt;</span><span style="background: black; color: #ffc66d">PropertyDescriptor</span><span style="background: black; color: white">&gt;();
        </span><span style="background: black; color: #cc7832">var </span><span style="background: black; color: white">modelClassProperties = </span><span style="background: black; color: #ffc66d">TypeDescriptor</span><span style="background: black; color: white">.GetProperties(instance.GetType())
            .Cast&lt;</span><span style="background: black; color: #ffc66d">PropertyDescriptor</span><span style="background: black; color: white">&gt;();

        </span><span style="background: black; color: #cc7832">var </span><span style="background: black; color: white">list = </span><span style="background: black; color: #cc7832">from </span><span style="background: black; color: white">buddyProp </span><span style="background: black; color: #cc7832">in </span><span style="background: black; color: white">buddyClassProperties
                   </span><span style="background: black; color: #cc7832">join </span><span style="background: black; color: white">modelProp </span><span style="background: black; color: #cc7832">in </span><span style="background: black; color: white">modelClassProperties </span><span style="background: black; color: #cc7832">on
                            </span><span style="background: black; color: white">buddyProp.Name </span><span style="background: black; color: #cc7832">equals </span><span style="background: black; color: white">modelProp.Name
                   </span><span style="background: black; color: #cc7832">from </span><span style="background: black; color: white">attribute </span><span style="background: black; color: #cc7832">in </span><span style="background: black; color: white">buddyProp.Attributes.OfType&lt;</span><span style="background: black; color: #ffc66d">ValidationAttribute</span><span style="background: black; color: white">&gt;()
                   </span><span style="background: black; color: #cc7832">where </span><span style="background: black; color: white">!attribute.IsValid(modelProp.GetValue(instance))
                   </span><span style="background: black; color: #cc7832">select new </span><span style="background: black; color: #ffc66d">ErrorInfo</span><span style="background: black; color: white">(
                       buddyProp.Name,
                       attribute.FormatErrorMessage(modelProp.Name),
                       instance);

        </span><span style="background: black; color: #cc7832">if </span><span style="background: black; color: white">(name != </span><span style="background: black; color: #cc7832">null</span><span style="background: black; color: white">)
            list = list.Where(x =&gt; x.PropertyName == name);

        </span><span style="background: black; color: #cc7832">return </span><span style="background: black; color: white">list;
    }
}</span></pre>
</td>
</tr>
</tbody>
</table>
<p>note: you will need the using statement and a reference to the xVal.dll<br /><span style="background: black; color: #cc7832">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; using </span><span style="background: black; color: white">xVal.ServerSide;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></p>
<p><a href="http://11011.net/software/vspaste" onclick="pageTracker._trackPageview('/outgoing/11011.net/software/vspaste?referer=');"></a></p>
<p>Now we can start.<br />Here is are sample controller actions. Creating a MyProduct and sending it to the view. Then accepting a MyProduct when the form gets posted back.</p>
<table cellspacing="0" cellpadding="2" width="400" border="1">
<tbody>
<tr>
<td style="background: black" valign="top" width="400">
<pre class="code"><span style="background: black; color: #cc7832">public </span><span style="background: black; color: #ffc66d">ActionResult </span><span style="background: black; color: white">ValidationTest()
{
    </span><span style="background: black; color: #ffc66d">MyProduct </span><span style="background: black; color: white">p = </span><span style="background: black; color: #cc7832">new </span><span style="background: black; color: #ffc66d">MyProduct</span><span style="background: black; color: white">()
    {
        ProductName = </span><span style="background: black; color: #a5c25c">"Magazine"</span><span style="background: black; color: white">,
        UnitPrice = </span><span style="background: black; color: #6897bb">23
    </span><span style="background: black; color: white">};

    p.Orders = </span><span style="background: black; color: #cc7832">new </span><span style="background: black; color: #ffc66d">List</span><span style="background: black; color: white">&lt;</span><span style="background: black; color: #ffc66d">MyOrder</span><span style="background: black; color: white">&gt;();
    p.Orders.Add(</span><span style="background: black; color: #cc7832">new </span><span style="background: black; color: #ffc66d">MyOrder </span><span style="background: black; color: white">{ Name = </span><span style="background: black; color: #a5c25c">"Robert King" </span><span style="background: black; color: white">});

    </span><span style="background: black; color: #cc7832">return </span><span style="background: black; color: white">View(p);
}</span></pre>
<pre class="code"><span style="background: black; color: white">[</span><span style="background: black; color: #ffc66d">AcceptVerbs</span><span style="background: black; color: white">(</span><span style="background: black; color: #6897bb">HttpVerbs</span><span style="background: black; color: white">.Post)]
</span><span style="background: black; color: #cc7832">public </span><span style="background: black; color: #ffc66d">ActionResult </span><span style="background: black; color: white">ValidationTest(</span><span style="background: black; color: #ffc66d">MyProduct </span><span style="background: black; color: white">product)
{
    </span><span style="background: black; color: #cc7832">if </span><span style="background: black; color: white">(ModelState.IsValid)
    {
        </span><span style="background: black; color: #cc7832">return </span><span style="background: black; color: white">RedirectToAction(</span><span style="background: black; color: #a5c25c">"ValidationTest"</span><span style="background: black; color: white">);
    }

    </span><span style="background: black; color: #cc7832">return </span><span style="background: black; color: white">View(product);
}</span></pre>
</td>
</tr>
</tbody>
</table>
<p>In the latter action method the product argument has already been validated by the time it arrives at the if statement. All that needs to be done is to check if the Modelstate is valid and if it is redirect back to the page else display the posted data back to the user with the errors in Modelstate.</p>
<p>Here is what the view looks like.</p>
<table cellspacing="0" cellpadding="2" width="400" border="1">
<tbody>
<tr>
<td style="background: black" valign="top" width="400">
<pre class="code"><span style="background: black; color: white">&lt;</span><span style="background: black; color: #e8bc64">h2</span><span style="background: black; color: white">&gt;Custom Validation&lt;/</span><span style="background: black; color: #e8bc64">h2</span><span style="background: black; color: white">&gt;

</span><span style="background: black; color: #6897bb">&lt;%</span><span style="background: black; color: white">= Html.ValidationSummary() </span><span style="background: black; color: #6897bb">%&gt;

&lt;% </span><span style="background: black; color: #cc7832">using </span><span style="background: black; color: white">(Html.BeginForm()) { </span><span style="background: black; color: #6897bb">%&gt;

    </span><span style="background: black; color: white">&lt;</span><span style="background: black; color: #e8bc64">div </span><span style="background: black; color: white">style=</span><span style="background: black; color: #a5c25c">"</span><span style="background: black; color: #fcf4be">padding-left</span><span style="background: black; color: white">: 15px</span><span style="background: black; color: #a5c25c">"</span><span style="background: black; color: white">&gt;
        &lt;</span><span style="background: black; color: #e8bc64">div</span><span style="background: black; color: white">&gt;
            Unit Price: </span><span style="background: black; color: #6897bb">&lt;%</span><span style="background: black; color: white">= Html.TextBox(</span><span style="background: black; color: #a5c25c">"product.UnitPrice"</span><span style="background: black; color: white">, Model.UnitPrice)</span><span style="background: black; color: #6897bb">%&gt;
            &lt;%</span><span style="background: black; color: white">= Html.ValidationMessage(</span><span style="background: black; color: #a5c25c">"product.UnitPrice"</span><span style="background: black; color: white">)</span><span style="background: black; color: #6897bb">%&gt;
        </span><span style="background: black; color: white">&lt;/</span><span style="background: black; color: #e8bc64">div</span><span style="background: black; color: white">&gt;
        &lt;</span><span style="background: black; color: #e8bc64">div</span><span style="background: black; color: white">&gt;
            Product Name: </span><span style="background: black; color: #6897bb">&lt;%</span><span style="background: black; color: white">= Html.TextBox(</span><span style="background: black; color: #a5c25c">"product.ProductName"</span><span style="background: black; color: white">, Model.ProductName)</span><span style="background: black; color: #6897bb">%&gt;
             &lt;%</span><span style="background: black; color: white">= Html.ValidationMessage(</span><span style="background: black; color: #a5c25c">"product.ProductName"</span><span style="background: black; color: white">)</span><span style="background: black; color: #6897bb">%&gt;
        </span><span style="background: black; color: white">&lt;/</span><span style="background: black; color: #e8bc64">div</span><span style="background: black; color: white">&gt;
        &lt;</span><span style="background: black; color: #e8bc64">div</span><span style="background: black; color: white">&gt;
            Orders:
            </span><span style="background: black; color: #6897bb">&lt;% </span><span style="background: black; color: #cc7832">int </span><span style="background: black; color: white">j = </span><span style="background: black; color: #6897bb">0</span><span style="background: black; color: white">;
               </span><span style="background: black; color: #cc7832">foreach </span><span style="background: black; color: white">(</span><span style="background: black; color: #ffc66d">MyOrder </span><span style="background: black; color: white">o </span><span style="background: black; color: #cc7832">in </span><span style="background: black; color: white">Model.Orders) { </span><span style="background: black; color: #6897bb">%&gt;
               </span><span style="background: black; color: white">&lt;</span><span style="background: black; color: #e8bc64">div  </span><span style="background: black; color: white">style=</span><span style="background: black; color: #a5c25c">"</span><span style="background: black; color: #fcf4be">padding-left</span><span style="background: black; color: white">: 15px</span><span style="background: black; color: #a5c25c">"</span><span style="background: black; color: white">&gt;
                    </span><span style="background: black; color: #6897bb">&lt;%</span><span style="background: black; color: white">= j + </span><span style="background: black; color: #6897bb">1 %&gt;</span><span style="background: black; color: white">. </span><span style="background: black; color: #6897bb">&lt;%</span><span style="background: black; color: white">= Html.TextBox(</span><span style="background: black; color: #a5c25c">"product.Orders[" </span><span style="background: black; color: white">+ j + </span><span style="background: black; color: #a5c25c">"].Name"</span><span style="background: black; color: white">, o.Name)</span><span style="background: black; color: #6897bb">%&gt;
                    &lt;%</span><span style="background: black; color: white">= Html.ValidationMessage(</span><span style="background: black; color: #a5c25c">"product.Orders[" </span><span style="background: black; color: white">+ j + </span><span style="background: black; color: #a5c25c">"].Name"</span><span style="background: black; color: white">)</span><span style="background: black; color: #6897bb">%&gt;</span><span style="background: black; color: white">&lt;</span><span style="background: black; color: #e8bc64">br </span><span style="background: black; color: white">/&gt;
                    </span><span style="background: black; color: #6897bb">&lt;% </span><span style="background: black; color: white">j++; </span><span style="background: black; color: #6897bb">%&gt;
               </span><span style="background: black; color: white">&lt;/</span><span style="background: black; color: #e8bc64">div</span><span style="background: black; color: white">&gt;
            </span><span style="background: black; color: #6897bb">&lt;% </span><span style="background: black; color: white">} </span><span style="background: black; color: #6897bb">%&gt;
        </span><span style="background: black; color: white">&lt;/</span><span style="background: black; color: #e8bc64">div</span><span style="background: black; color: white">&gt;
    &lt;/</span><span style="background: black; color: #e8bc64">div</span><span style="background: black; color: white">&gt;

    &lt;</span><span style="background: black; color: #e8bc64">br </span><span style="background: black; color: white">/&gt;
    &lt;</span><span style="background: black; color: #e8bc64">input </span><span style="background: black; color: white">type=</span><span style="background: black; color: #a5c25c">"submit" </span><span style="background: black; color: white">/&gt;

</span><span style="background: black; color: #6897bb">&lt;% </span><span style="background: black; color: white">} </span><span style="background: black; color: #6897bb">%&gt;</span></pre>
<p><a href="http://11011.net/software/vspaste" onclick="pageTracker._trackPageview('/outgoing/11011.net/software/vspaste?referer=');"></a></td>
</tr>
</tbody>
</table>
<p>Not that this even works when complex binding lists to that have been posted. I&#8217;ll try and get a full working example for download here as well if I get enough interest.</p>
<p>And that&#8217;s it. In upcoming posts I&#8217;ll show you how:</p>
<ul>
<li>To do the validation without using the IDataErrorInfo interface and its automatic binding.
<li>Use the methods that come with <a href="http://www.codeplex.com/xval" target="_blank" onclick="pageTracker._trackPageview('/outgoing/www.codeplex.com/xval?referer=');">xVal</a> to implement some client side validation.
<li>How to create your own validation attributes.
<li>Plugging in Castle Validator or other supported validators into <a href="http://www.codeplex.com/xval" target="_blank" onclick="pageTracker._trackPageview('/outgoing/www.codeplex.com/xval?referer=');">xVal</a>.</li>
</ul>
<p>Hope this helps you get started with Validation in Asp.net MVC.</p>
<p>Cheers,<br />Adam</p>
]]></content:encoded>
			<wfw:commentRss>http://schotime.net/blog/index.php/2009/03/05/validation-with-aspnet-mvc-xval-idataerrorinfo/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://schotime.net/blog/index.php/2009/03/05/validation-with-aspnet-mvc-xval-idataerrorinfo/</feedburner:origLink></item>
		<item>
		<title>Custom Authorization With Asp.net MVC</title>
		<link>http://feedproxy.google.com/~r/Schotime/~3/2bSBV4aSrNI/</link>
		<comments>http://schotime.net/blog/index.php/2009/02/17/custom-authorization-with-aspnet-mvc/#comments</comments>
		<pubDate>Tue, 17 Feb 2009 11:17:29 +0000</pubDate>
		<dc:creator>Schotime</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[C# MVC .net]]></category>

		<guid isPermaLink="false">http://schotime.net/blog/index.php/2009/02/17/custom-authorization-with-aspnet-mvc/</guid>
		<description><![CDATA[The whole advantage with MVC over webforms is extensibility at every point. Extensibility, Extensibility, Extensibility.
Authorization is a very important and every web project has there own needs and requirements. Full customisation is paramount.
Here I will show you a simple way to customise your authorization.
In MVC attributes are used to protect a controller method, so we [...]]]></description>
			<content:encoded><![CDATA[<p>The whole advantage with MVC over webforms is extensibility at every point. Extensibility, Extensibility, Extensibility.</p>
<p>Authorization is a very important and every web project has there own needs and requirements. Full customisation is paramount.</p>
<p>Here I will show you a simple way to customise your authorization.</p>
<p>In MVC attributes are used to protect a controller method, so we to get started all we need to do is inherit from the AuthorizeAttribute class.</p>
<table border="1" cellspacing="0" cellpadding="2" width="400">
<tbody>
<tr>
<td style="background: black" width="400" valign="top">
<pre class="code"><span style="background: black; color: #cc7832">    public class </span><span style="background: black; color: #ffc66d">CustomAuthorizeAttribute </span><span style="background: black; color: white">: </span><span style="background: black; color: #ffc66d">AuthorizeAttribute
    </span><span style="background: black; color: white">{
        </span><span style="background: black; color: #cc7832">protected override bool </span><span style="background: black; color: white">AuthorizeCore(</span><span style="background: black; color: #ffc66d">HttpContextBase </span><span style="background: black; color: white">httpContext)
        {
            </span><span style="background: black; color: #cc7832">string</span><span style="background: black; color: white">[] users = Users.Split(</span><span style="background: black; color: #a5c25c">','</span><span style="background: black; color: white">);

            </span><span style="background: black; color: #cc7832">if </span><span style="background: black; color: white">(!httpContext.User.Identity.IsAuthenticated)
                </span><span style="background: black; color: #cc7832">return false</span><span style="background: black; color: white">;

            </span><span style="background: black; color: #cc7832">if </span><span style="background: black; color: white">(users.Length &gt; </span><span style="background: black; color: #6897bb">0 </span><span style="background: black; color: white">&amp;&amp;
                !users.Contains(httpContext.User.Identity.Name,
                    </span><span style="background: black; color: #ffc66d">StringComparer</span><span style="background: black; color: white">.OrdinalIgnoreCase))
                </span><span style="background: black; color: #cc7832">return false</span><span style="background: black; color: white">;

            </span><span style="background: black; color: #cc7832">return true</span><span style="background: black; color: white">;
        }
    }</span></pre>
</td>
</tr>
</tbody>
</table>
<p>This is the basics. We can put any logic we like in here and all we have to do is return false if for whatever reason the user should not be authorized. Then all you need to do is decorate the controller method with the new attribute as below.</p>
<table border="1" cellspacing="0" cellpadding="2" width="400">
<tbody>
<tr>
<td style="background: black" width="400" valign="top">
<pre class="code"><span style="background: black; color: white">    [</span><span style="background: black; color: #ffc66d">CustomAuthorize</span><span style="background: black; color: white">]
    </span><span style="background: black; color: #cc7832">public </span><span style="background: black; color: #ffc66d">ActionResult </span><span style="background: black; color: white">Index()
    {
        </span><span style="background: black; color: #cc7832">return </span><span style="background: black; color: white">View();
    }</span></pre>
</td>
</tr>
</tbody>
</table>
<p>From this simple example we can expand it with custom Roles.</p>
<table border="1" cellspacing="0" cellpadding="2" width="400">
<tbody>
<tr>
<td style="background: black" width="400" valign="top">
<pre class="code"><span style="background: black; color: white">    </span><span style="background: black; color: #cc7832">public class </span><span style="background: black; color: #ffc66d">CustomAuthorizeAttribute </span><span style="background: black; color: white">: </span><span style="background: black; color: #ffc66d">AuthorizeAttribute
    </span><span style="background: black; color: white">{
        </span><span style="background: black; color: gray">// the "new" must be used here because we are overriding
        // the Roles property on the underlying class
        </span><span style="background: black; color: #cc7832">public new </span><span style="background: black; color: #6897bb">SiteRoles </span><span style="background: black; color: white">Roles;

        </span><span style="background: black; color: #cc7832">protected override bool </span><span style="background: black; color: white">AuthorizeCore(</span><span style="background: black; color: #ffc66d">HttpContextBase </span><span style="background: black; color: white">httpContext)
        {
            </span><span style="background: black; color: #cc7832">if </span><span style="background: black; color: white">(httpContext == </span><span style="background: black; color: #cc7832">null</span><span style="background: black; color: white">)
                </span><span style="background: black; color: #cc7832">throw new </span><span style="background: black; color: #ffc66d">ArgumentNullException</span><span style="background: black; color: white">(</span><span style="background: black; color: #a5c25c">"httpContext"</span><span style="background: black; color: white">);

            </span><span style="background: black; color: #cc7832">string</span><span style="background: black; color: white">[] users = Users.Split(',');

</span><span style="background: black; color: white">            </span><span style="background: black; color: #cc7832">if </span><span style="background: black; color: white">(!httpContext.User.Identity.IsAuthenticated)
                </span><span style="background: black; color: #cc7832">return false</span><span style="background: black; color: white">;

            </span><span style="background: black; color: #6897bb">SiteRoles </span><span style="background: black; color: white">role = (</span><span style="background: black; color: #6897bb">SiteRoles</span><span style="background: black; color: white">)httpContext.Session[</span><span style="background: black; color: #a5c25c">"role"</span><span style="background: black; color: white">];

            </span><span style="background: black; color: #cc7832">if </span><span style="background: black; color: white">(</span><span style="background: black; color: white">Roles != 0 &amp;&amp; ((Roles</span><span style="background: black; color: white"> &amp; </span><span style="background: black; color: white">role) != role))</span><span style="background: black; color: white">
                </span><span style="background: black; color: #cc7832">return false</span><span style="background: black; color: white">;

            </span><span style="background: black; color: #cc7832">return true</span><span style="background: black; color: white">;
        }
    }</span></pre>
</td>
</tr>
</tbody>
</table>
<p>Where the SiteRoles class is defined as below.</p>
<table border="1" cellspacing="0" cellpadding="2" width="400">
<tbody>
<tr>
<td style="background: black" width="400" valign="top">
<pre class="code"><span style="background: black; color: white">    [</span><span style="background: black; color: #ffc66d">Serializable</span><span style="background: black; color: white">]
    [</span><span style="background: black; color: #ffc66d">Flags</span><span style="background: black; color: white">]
    </span><span style="background: black; color: #cc7832">public enum </span><span style="background: black; color: #6897bb">SiteRoles
    </span><span style="background: black; color: white">{
        User = </span><span style="background: black; color: #6897bb">1 </span><span style="background: black; color: white">&lt;&lt; </span><span style="background: black; color: #6897bb">0</span><span style="background: black; color: white">,
        Admin = </span><span style="background: black; color: #6897bb">1 </span><span style="background: black; color: white">&lt;&lt; </span><span style="background: black; color: #6897bb">1</span><span style="background: black; color: white">,
        Helpdesk = </span><span style="background: black; color: #6897bb">1 </span><span style="background: black; color: white">&lt;&lt; </span><span style="background: black; color: #6897bb">2
    </span><span style="background: black; color: white">}</span></pre>
</td>
</tr>
</tbody>
</table>
<p>This can then be used be used as follows.</p>
<table border="1" cellspacing="0" cellpadding="2" width="400">
<tbody>
<tr>
<td style="background: black" width="400" valign="top">
<pre class="code"><span style="background: black; color: white">    [</span><span style="background: black; color: #ffc66d">CustomAuthorize</span><span style="background: black; color: white">(Roles=</span><span style="background: black; color: #6897bb">SiteRoles</span><span style="background: black; color: white">.Admin|</span><span style="background: black; color: #6897bb">SiteRoles</span><span style="background: black; color: white">.HelpDesk)]
    </span><span style="background: black; color: #cc7832">public </span><span style="background: black; color: #ffc66d">ActionResult </span><span style="background: black; color: white">Index()
    {
        </span><span style="background: black; color: #cc7832">return </span><span style="background: black; color: white">View();
    }</span></pre>
</td>
</tr>
</tbody>
</table>
<p>This will only allow the Admin and the Helpdesk Role access to the Index controller. If you don&#8217;t belong to one of these roles then you will be sent to the Login page.</p>
<p>The possibilities are really endless.<br />
Happy coding.</p>
<p>Adam</p>
]]></content:encoded>
			<wfw:commentRss>http://schotime.net/blog/index.php/2009/02/17/custom-authorization-with-aspnet-mvc/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		<feedburner:origLink>http://schotime.net/blog/index.php/2009/02/17/custom-authorization-with-aspnet-mvc/</feedburner:origLink></item>
		<item>
		<title>Retrieving Data Without the Dataset With Custom SQL</title>
		<link>http://feedproxy.google.com/~r/Schotime/~3/mwX-2jKypC8/</link>
		<comments>http://schotime.net/blog/index.php/2009/02/12/retrieving-data-without-the-dataset-with-custom-sql/#comments</comments>
		<pubDate>Thu, 12 Feb 2009 10:38:16 +0000</pubDate>
		<dc:creator>Schotime</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Linq C# MySql]]></category>

		<guid isPermaLink="false">http://schotime.net/blog/index.php/2009/02/12/retrieving-data-without-the-dataset-with-custom-sql/</guid>
		<description><![CDATA[In my previous post I used custom sql query and transformed the results into a nested class. However you may have overlooked way I got the data into a class. It quite easy and will work with all database connectors that implement IDbConnection.
Here is how its done. We use the DataContext that came with and [...]]]></description>
			<content:encoded><![CDATA[<p>In my previous post I used custom sql query and transformed the results into a nested class. However you may have overlooked way I got the data into a class. It quite easy and will work with all database connectors that implement IDbConnection.</p>
<p>Here is how its done. We use the DataContext that came with and used by Linq2Sql.</p>
<table cellspacing="0" cellpadding="2" width="400" border="1">
<tbody>
<tr>
<td style="background: black" valign="top" width="400">
<pre class="code"><span style="background: black; color: white">        </span><span style="background: black; color: #cc7832">public class </span><span style="background: black; color: #ffc66d">RawData
        </span><span style="background: black; color: white">{
            </span><span style="background: black; color: #cc7832">public int </span><span style="background: black; color: white">MyId { </span><span style="background: black; color: #cc7832">get</span><span style="background: black; color: white">; </span><span style="background: black; color: #cc7832">set</span><span style="background: black; color: white">; }
            </span><span style="background: black; color: #cc7832">public string </span><span style="background: black; color: white">Name { </span><span style="background: black; color: #cc7832">get</span><span style="background: black; color: white">; </span><span style="background: black; color: #cc7832">set</span><span style="background: black; color: white">; }
        }</span></pre>
</td>
</tr>
</tbody>
</table>
<p></p>
<table cellspacing="0" cellpadding="2" width="400" border="1">
<tbody>
<tr>
<td style="background: black" valign="top" width="400">
<pre class="code"><span style="background: black; color: white"></span><span style="background: black; color: white"></span></pre>
<pre class="code"><span style="background: black; color: white">        </span><span style="background: black; color: #ffc66d">DataContext </span><span style="background: black; color: white">dc = </span><span style="background: black; color: #cc7832">new </span><span style="background: black; color: #ffc66d">DataContext</span><span style="background: black; color: white">(</span><span style="background: black; color: #cc7832">new </span><span style="background: black; color: white">MySqlConnection(connString));
        </span><span style="background: black; color: #6897bb">IEnumerable</span><span style="background: black; color: white">&lt;</span><span style="background: black; color: #ffc66d">RawData</span><span style="background: black; color: white">&gt; rd =
            dc.ExecuteQuery&lt;</span><span style="background: black; color: #ffc66d">RawData</span><span style="background: black; color: white">&gt;(</span><span style="background: black; color: #a5c25c">"select myid, name from mytable where myid &gt; ?"</span><span style="background: black; color: white">,5);</span></pre>
<p><a href="http://11011.net/software/vspaste" onclick="pageTracker._trackPageview('/outgoing/11011.net/software/vspaste?referer=');"></a></td>
</tr>
</tbody>
</table>
<p>And thats it. All the data from the mytable database table will get pushed into the IEnumerable&lt;RawData&gt; variable. As long as the names of the columns are the same as the class then this will work. This ExecuteQuery method also takes a parameters object argument which will replace the question marks with the variables specified.</p>
<p>It makes it very easy, especially since there isn&#8217;t a very good linq 2 mysql option out there yet and Entity Framework still doesn&#8217;t support it.</p>
<p>Cheers,<br />Adam</p>
]]></content:encoded>
			<wfw:commentRss>http://schotime.net/blog/index.php/2009/02/12/retrieving-data-without-the-dataset-with-custom-sql/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://schotime.net/blog/index.php/2009/02/12/retrieving-data-without-the-dataset-with-custom-sql/</feedburner:origLink></item>
		<item>
		<title>Transforming one-to-many Sql into Nested Class</title>
		<link>http://feedproxy.google.com/~r/Schotime/~3/kVQlzcEEfRM/</link>
		<comments>http://schotime.net/blog/index.php/2009/01/22/transforming-one-to-many-sql-into-nested-class/#comments</comments>
		<pubDate>Thu, 22 Jan 2009 11:13:13 +0000</pubDate>
		<dc:creator>Schotime</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Linq]]></category>

		<guid isPermaLink="false">http://schotime.net/blog/index.php/2009/01/22/transforming-one-to-many-sql-into-nested-class/</guid>
		<description><![CDATA[Back in the days of Classic ASP, when you had a one too many relationship displaying the data was pretty painful. You would do things like 




        var reference_number_old = &#34;$##%@&#34;;
        while (recordsExist)
        {
 [...]]]></description>
			<content:encoded><![CDATA[<p>Back in the days of Classic ASP, when you had a one too many relationship displaying the data was pretty painful. You would do things like </p>
<table style="background: black" cellspacing="0" cellpadding="2" width="400" border="1">
<tbody>
<tr>
<td valign="top" width="400">
<pre class="code"><span style="background: black; color: white">        var reference_number_old = </span><span style="background: black; color: #a5c25c">&quot;$##%@&quot;</span><span style="background: black; color: white">;
        </span><span style="background: black; color: #cc7832">while </span><span style="background: black; color: white">(recordsExist)
        {
            reference_number = String(rs(</span><span style="background: black; color: #6897bb">0</span><span style="background: black; color: white">));

            </span><span style="background: black; color: #cc7832">if </span><span style="background: black; color: white">(reference_number_old != reference_number)
            {
                Response.Write(reference_number);
                reference_number_old = reference_number;
            }

            </span><span style="background: black; color: gray">//Do more stuff
        </span><span style="background: black; color: white">}</span></pre>
</td>
</tr>
</tbody>
</table>
<p>Sooo very very painful, and that&#8217;s only grouping by one column (reference number).</p>
<p>Now however with OO programming and the advance of Linq there is a much nicer and easier way to deal with this Master-Detail type one-to-many relationship.</p>
<p>Lets see how we do it now, still using our own custom sql.<br />
  <br />Firstly here is our class to represent our flat data straight out of the database.</p>
<table style="background: black" cellspacing="0" cellpadding="2" width="400" border="1">
<tbody>
<tr>
<td valign="top" width="400">
        </p>
<pre class="code"><span style="background: black; color: white">        </span><span style="background: black; color: #cc7832">public class </span><span style="background: black; color: #ffc66d">FlatCustomerAndOrders
        </span><span style="background: black; color: white">{
            </span><span style="background: black; color: #cc7832">public int </span><span style="background: black; color: white">ReferenceNumber { </span><span style="background: black; color: #cc7832">get</span><span style="background: black; color: white">; </span><span style="background: black; color: #cc7832">set</span><span style="background: black; color: white">; }
            </span><span style="background: black; color: #cc7832">public string </span><span style="background: black; color: white">Name { </span><span style="background: black; color: #cc7832">get</span><span style="background: black; color: white">; </span><span style="background: black; color: #cc7832">set</span><span style="background: black; color: white">; }
            </span><span style="background: black; color: #cc7832">public string </span><span style="background: black; color: white">Address { </span><span style="background: black; color: #cc7832">get</span><span style="background: black; color: white">; </span><span style="background: black; color: #cc7832">set</span><span style="background: black; color: white">; }
            </span><span style="background: black; color: #cc7832">public int </span><span style="background: black; color: white">OrderId { </span><span style="background: black; color: #cc7832">get</span><span style="background: black; color: white">; </span><span style="background: black; color: #cc7832">set</span><span style="background: black; color: white">; }
            </span><span style="background: black; color: #cc7832">public string </span><span style="background: black; color: white">ProductName { </span><span style="background: black; color: #cc7832">get</span><span style="background: black; color: white">; </span><span style="background: black; color: #cc7832">set</span><span style="background: black; color: white">; }
            </span><span style="background: black; color: #cc7832">public string </span><span style="background: black; color: white">Description { </span><span style="background: black; color: #cc7832">get</span><span style="background: black; color: white">; </span><span style="background: black; color: #cc7832">set</span><span style="background: black; color: white">; }
            </span><span style="background: black; color: #cc7832">public decimal </span><span style="background: black; color: white">Amount { </span><span style="background: black; color: #cc7832">get</span><span style="background: black; color: white">; </span><span style="background: black; color: #cc7832">set</span><span style="background: black; color: white">; }
        }</span></pre>
</td>
</tr>
</tbody>
</table>
<p>Even filling this class used to be a bit painful before Linq. You would have to create a connection, create a reader, then instantiate the FlatCustomerAndOrders class. Set the properties then add the object to a list while records could still be read. Here&#8217;s how I do it now.</p>
<table style="background: black" cellspacing="0" cellpadding="2" width="400" border="1">
<tbody>
<tr>
<td valign="top" width="400">
<pre class="code"><span style="background: black; color: white">        </span><span style="background: black; color: #ffc66d">DataContext </span><span style="background: black; color: white">dc = </span><span style="background: black; color: #cc7832">new </span><span style="background: black; color: #ffc66d">DataContext</span><span style="background: black; color: white">(</span><span style="background: black; color: #cc7832">new </span><span style="background: black; color: #ffc66d">SqlConnection</span><span style="background: black; color: white">(connString));
        </span><span style="background: black; color: #6897bb">IEnumerable</span><span style="background: black; color: white">&lt;</span><span style="background: black; color: #ffc66d">FlatCustomerAndOrders</span><span style="background: black; color: white">&gt; flat =
            dc.ExecuteQuery&lt;</span><span style="background: black; color: #ffc66d">FlatCustomerAndOrders</span><span style="background: black; color: white">&gt;(</span><span style="background: black; color: #a5c25c">&quot;select c.referencenumber, c.name,&quot; </span><span style="background: black; color: white">+
            </span><span style="background: black; color: #a5c25c">&quot;c.address, o.orderid, o.productname, o.description, o.amount from customers &quot; </span><span style="background: black; color: white">+
            </span><span style="background: black; color: #a5c25c">&quot;c inner join orders o on c.referencenumber = o.referencenumber&quot;</span><span style="background: black; color: white">);
</span></pre>
<p>        <a href="http://11011.net/software/vspaste" onclick="pageTracker._trackPageview('/outgoing/11011.net/software/vspaste?referer=');"></a></td>
</tr>
</tbody>
</table>
<p>Thats its. We have our List of FlatCustomerAndOrders.<br />
  <br />The next step is to organise the data so that the data is nested so its easy to display with just two foreach loops. The two classes:</p>
<table style="background: black" cellspacing="0" cellpadding="2" width="400" border="1">
<tbody>
<tr>
<td valign="top" width="400">
        </p>
<pre class="code"><span style="background: black; color: white">        </span><span style="background: black; color: #cc7832">public class </span><span style="background: black; color: #ffc66d">Customer
        </span><span style="background: black; color: white">{
            </span><span style="background: black; color: #cc7832">public int </span><span style="background: black; color: white">ReferenceNumber { </span><span style="background: black; color: #cc7832">get</span><span style="background: black; color: white">; </span><span style="background: black; color: #cc7832">set</span><span style="background: black; color: white">; }
            </span><span style="background: black; color: #cc7832">public string </span><span style="background: black; color: white">Name { </span><span style="background: black; color: #cc7832">get</span><span style="background: black; color: white">; </span><span style="background: black; color: #cc7832">set</span><span style="background: black; color: white">; }
            </span><span style="background: black; color: #cc7832">public string </span><span style="background: black; color: white">Address { </span><span style="background: black; color: #cc7832">get</span><span style="background: black; color: white">; </span><span style="background: black; color: #cc7832">set</span><span style="background: black; color: white">; }
            </span><span style="background: black; color: #cc7832">public </span><span style="background: black; color: #ffc66d">List</span><span style="background: black; color: white">&lt;</span><span style="background: black; color: #ffc66d">Order</span><span style="background: black; color: white">&gt; Orders { </span><span style="background: black; color: #cc7832">get</span><span style="background: black; color: white">; </span><span style="background: black; color: #cc7832">set</span><span style="background: black; color: white">; }
        }

        </span><span style="background: black; color: #cc7832">public class </span><span style="background: black; color: #ffc66d">Order
        </span><span style="background: black; color: white">{
            </span><span style="background: black; color: #cc7832">public int </span><span style="background: black; color: white">OrderId { </span><span style="background: black; color: #cc7832">get</span><span style="background: black; color: white">; </span><span style="background: black; color: #cc7832">set</span><span style="background: black; color: white">; }
            </span><span style="background: black; color: #cc7832">public string </span><span style="background: black; color: white">ProductName { </span><span style="background: black; color: #cc7832">get</span><span style="background: black; color: white">; </span><span style="background: black; color: #cc7832">set</span><span style="background: black; color: white">; }
            </span><span style="background: black; color: #cc7832">public string </span><span style="background: black; color: white">Description { </span><span style="background: black; color: #cc7832">get</span><span style="background: black; color: white">; </span><span style="background: black; color: #cc7832">set</span><span style="background: black; color: white">; }
            </span><span style="background: black; color: #cc7832">public decimal </span><span style="background: black; color: white">Amount { </span><span style="background: black; color: #cc7832">get</span><span style="background: black; color: white">; </span><span style="background: black; color: #cc7832">set</span><span style="background: black; color: white">; }
        }</span></pre>
</td>
</tr>
</tbody>
</table>
<p>To fill these two class we do some clever Linq using the GroupBy method. Here&#8217;s the code.</p>
<table style="background: black" cellspacing="0" cellpadding="2" width="400" border="1">
<tbody>
<tr>
<td valign="top" width="400">
<pre class="code"><span style="background: black; color: white">        </span><span style="background: black; color: #6897bb">IList</span><span style="background: black; color: white">&lt;</span><span style="background: black; color: #ffc66d">Customer</span><span style="background: black; color: white">&gt; Customers =
            flat.GroupBy(cust =&gt; </span><span style="background: black; color: #cc7832">new </span><span style="background: black; color: white">{ cust.ReferenceNumber, cust.Name, cust.Address })
                .Select(c =&gt; </span><span style="background: black; color: #cc7832">new </span><span style="background: black; color: #ffc66d">Customer</span><span style="background: black; color: white">()
                {
                    ReferenceNumber = c.Key.ReferenceNumber,
                    Name = c.Key.Name,
                    Address = c.Key.Address,
                    Orders = c.Select(o =&gt; </span><span style="background: black; color: #cc7832">new </span><span style="background: black; color: #ffc66d">Order</span><span style="background: black; color: white">()
                    {
                        OrderId = o.OrderId,
                        ProductName = o.ProductName,
                        Description = o.Description,
                        Amount = o.Amount
                    }).ToList()
                }).ToList();</span></pre>
</td>
</tr>
</tbody>
</table>
<p>And that&#8217;s it. It may look like a bit of a mouthful but its quite simple really.<br />
  <br />It just takes the flat list and applies the groupby method to it grouping by the three customer columns. It then builds a new list to fill the Orders property with. </p>
<p>Its then super easy to display the data like so.</p>
<table style="background: black" cellspacing="0" cellpadding="2" width="400" border="1">
<tbody>
<tr>
<td valign="top" width="400">
<pre class="code"><span style="background: black; color: white">       </span><span style="background: black; color: #cc7832"> foreach </span><span style="background: black; color: white">(</span><span style="background: black; color: #ffc66d">Customer </span><span style="background: black; color: white">c </span><span style="background: black; color: #cc7832">in </span><span style="background: black; color: white">Customers)
        {
            </span><span style="background: black; color: gray">//Display the customer details

            </span><span style="background: black; color: #cc7832">foreach </span><span style="background: black; color: white">(</span><span style="background: black; color: #ffc66d">Order </span><span style="background: black; color: white">o </span><span style="background: black; color: #cc7832">in </span><span style="background: black; color: white">c.Orders)
            {
                </span><span style="background: black; color: gray">//Display the orders for each customer
            </span><span style="background: black; color: white">}
        }
</span></pre>
<p>        <a href="http://11011.net/software/vspaste" onclick="pageTracker._trackPageview('/outgoing/11011.net/software/vspaste?referer=');"></a></td>
</tr>
</tbody>
</table>
<p>Well I hope this helps you as much as it has helped me.</p>
<p>Cheers<br />
  <br />Schotime </p>
]]></content:encoded>
			<wfw:commentRss>http://schotime.net/blog/index.php/2009/01/22/transforming-one-to-many-sql-into-nested-class/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://schotime.net/blog/index.php/2009/01/22/transforming-one-to-many-sql-into-nested-class/</feedburner:origLink></item>
		<item>
		<title>Running ASP.NET MVC Applications Under IIS6</title>
		<link>http://feedproxy.google.com/~r/Schotime/~3/wxVEjEjZsVo/</link>
		<comments>http://schotime.net/blog/index.php/2008/10/18/running-aspnet-mvc-applications-under-iis6/#comments</comments>
		<pubDate>Sat, 18 Oct 2008 09:41:29 +0000</pubDate>
		<dc:creator>Schotime</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[MVC]]></category>
		<category><![CDATA[Routing]]></category>

		<guid isPermaLink="false">http://schotime.net/blog/index.php/2008/10/18/running-aspnet-mvc-applications-under-iis6/</guid>
		<description><![CDATA[Yes&#8230;Finally&#8230;I have full control of my HTML again, but am still able to work with a great language like C#. MVC is here and its great. I&#8217;m absolutely loving it. But how the heck do you get it to work under IIS6. What if I want extensionless URL&#8217;s? Here is a few options for you.
Option [...]]]></description>
			<content:encoded><![CDATA[<p>Yes&#8230;Finally&#8230;I have full control of my HTML again, but am still able to work with a great language like C#. MVC is here and its great. I&#8217;m absolutely loving it. But how the heck do you get it to work under IIS6. What if I want extensionless URL&#8217;s? Here is a few options for you.</p>
<p><strong>Option 1:      <br /></strong>Running IIS with Wildcard Application mapping.</p>
<p>This option allows extensionless URL&#8217;s but a what performance price. Every single request including images, files and css etc. will get passed through the aspnet_isapi.dll. For small sites this may not be a huge issue, but small sites soon because large sites and this then becomes an issue.</p>
<p>I&#8217;m not going to run through how to do this, because there are already some nice blogs about this and I don&#8217;t really recommend this option.</p>
<p><strong>Option 2:      <br /></strong>Running IIS with .mvc (or whatever you like) extensions.</p>
<p>I started out running my site (schotime.net) like this, however in the end I decided on Option 3.    <br />URLs look like this.&#160;&#160; /Home.mvc/Index&#160;&#160; rather than /Home/Index&#160; which is not that bad but again not as nice as the latter.</p>
<p>Anyways here&#8217;s how you set this up.    <br />Firstly your global.asax.cs should look like this.</p>
<table style="background: black" cellspacing="0" cellpadding="2" width="400" border="1">
<tbody>
<tr>
<td valign="top" width="400">
<pre class="code"><span style="background: black; color: #cc7832">using </span><span style="background: black; color: white">System;
</span><span style="background: black; color: #cc7832">using </span><span style="background: black; color: white">System.Collections.Generic;
</span><span style="background: black; color: #cc7832">using </span><span style="background: black; color: white">System.Linq;
</span><span style="background: black; color: #cc7832">using </span><span style="background: black; color: white">System.Web;
</span><span style="background: black; color: #cc7832">using </span><span style="background: black; color: white">System.Web.Mvc;
</span><span style="background: black; color: #cc7832">using </span><span style="background: black; color: white">System.Web.Routing;

</span><span style="background: black; color: #cc7832">namespace </span><span style="background: black; color: white">MVCApplication1
{
    </span><span style="background: black; color: #cc7832">public class </span><span style="background: black; color: #ffc66d">MvcApplication </span><span style="background: black; color: white">: System.Web.HttpApplication
    {
        </span><span style="background: black; color: #cc7832">public static void </span><span style="background: black; color: white">RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute(</span><span style="background: black; color: #a5c25c">&quot;{resource}.axd/{*pathInfo}&quot;</span><span style="background: black; color: white">);

            routes.MapRoute(
                </span><span style="background: black; color: #a5c25c">&quot;Default&quot;</span><span style="background: black; color: white">,                                              </span><span style="background: black; color: gray">
                </span><span style="background: black; color: #a5c25c">&quot;{controller}.mvc/{action}/{id}&quot;</span><span style="background: black; color: white">,                       </span><span style="background: black; color: gray">
                </span><span style="background: black; color: #cc7832">new </span><span style="background: black; color: white">{ controller = </span><span style="background: black; color: #a5c25c">&quot;Home&quot;</span><span style="background: black; color: white">, action = </span><span style="background: black; color: #a5c25c">&quot;Index&quot;</span><span style="background: black; color: white">, id = </span><span style="background: black; color: #a5c25c">&quot;&quot; </span><span style="background: black; color: white">}  </span><span style="background: black; color: gray">
            </span><span style="background: black; color: white">);

            routes.MapRoute(
                </span><span style="background: black; color: #a5c25c">&quot;Defaultest&quot;</span><span style="background: black; color: white">,                                           </span><span style="background: black; color: gray">
                </span><span style="background: black; color: #a5c25c">&quot;Default.aspx&quot;</span><span style="background: black; color: white">,                                         </span><span style="background: black; color: gray">
                </span><span style="background: black; color: #cc7832">new </span><span style="background: black; color: white">{ controller = </span><span style="background: black; color: #a5c25c">&quot;Home&quot;</span><span style="background: black; color: white">, action = </span><span style="background: black; color: #a5c25c">&quot;Index&quot;</span><span style="background: black; color: white">, id = </span><span style="background: black; color: #a5c25c">&quot;&quot; </span><span style="background: black; color: white">}  </span><span style="background: black; color: gray">
            </span><span style="background: black; color: white">);

        }

        </span><span style="background: black; color: #cc7832">protected void </span><span style="background: black; color: white">Application_Start()
        {
            RegisterRoutes(RouteTable.Routes);
            RouteTable.Routes.RouteExistingFiles = </span><span style="background: black; color: #cc7832">true</span><span style="background: black; color: white">;
        }
    }
}</span></pre>
<p>        <a href="http://11011.net/software/vspaste" onclick="pageTracker._trackPageview('/outgoing/11011.net/software/vspaste?referer=');"></a></td>
</tr>
</tbody>
</table>
<p>This will get you started. All you need to do then is map the extension .mvc to the aspnet_isapi.dll in IIS under Home Directory -&gt; Configuration -&gt; Mappings or use an already mapped extension like .aspx and your mvc application should work.</p>
<p><strong>Option 3:<br />
    <br /></strong>This option requires the use of a clever isapi filter to rewrite the URLs. </p>
<p>I originally read an article on <a href="http://biasecurities.com/blog/2008/how-to-enable-pretty-urls-with-asp-net-mvc-and-iis6/" target="_blank" onclick="pageTracker._trackPageview('/outgoing/biasecurities.com/blog/2008/how-to-enable-pretty-urls-with-asp-net-mvc-and-iis6/?referer=');">Bia Securities</a> which uses the Isapi_rewrite 3rd party plugin however, Isapi_rewrite is not free so I thought I would find a suitable open source solution. Here it is: Ionic Rewriter -&gt; <a title="http://www.codeplex.com/IIRF" href="http://www.codeplex.com/IIRF" onclick="pageTracker._trackPageview('/outgoing/www.codeplex.com/IIRF?referer=');">http://www.codeplex.com/IIRF</a> </p>
<p>It works in much the same way as the isapi_rewrite but will a few little differences. Once you download the IsapiRewrite4.dll, place the dll in a directory eg. C:\WINDOWS\system32\inetsrv\IIRF and run through the installation instructions included in the download (readme.txt) under Installation. Next comes the configuration. Firstly here is the IsapiRewrite4.ini configuration file ported from the <a href="http://biasecurities.com/blog/2008/how-to-enable-pretty-urls-with-asp-net-mvc-and-iis6/" target="_blank" onclick="pageTracker._trackPageview('/outgoing/biasecurities.com/blog/2008/how-to-enable-pretty-urls-with-asp-net-mvc-and-iis6/?referer=');">Bia Securities</a> article.</p>
<table cellspacing="0" cellpadding="2" width="400" border="1">
<tbody>
<tr>
<td valign="top" width="400">
<p>#RewriteLog&#160; c:\temp\iirfLog.out<br />
          <br />#RewriteLogLevel 3 </p>
<p>RewriteRule ^/Default\.aspx /Home.mvc [I,L] </p>
<p>RewriteRule ^/$ /Home.mvc [I,L] </p>
<p>RewriteRule ^/([\w]+)$ /$1.mvc [I,L] </p>
<p>RewriteRule ^/(?!Content)([\w]*)/(.*) /$1.mvc/$2 [I,L]</p>
</td>
</tr>
</tbody>
</table>
<p>The [I,L] stands for a case-insensitive match and to stop processing if the current rule is a match.</p>
<p><strong>Important Note:<br />
    <br /></strong>Any physical files that you directly linked to should not be routed. In my MVC folder system I store all of these files under the /Content directory. Wherever you store your files replace the text Content with the folder that your files reside. otherwise images, css etc. will fail to display. </p>
<p>Now all that&#8217;s left to do is to modify the global.asax.cs to support this. </p>
<table style="background: black" cellspacing="0" cellpadding="2" width="400" border="1">
<tbody>
<tr>
<td valign="top" width="400">
<pre class="code"><span style="background: black; color: #cc7832">using </span><span style="background: black; color: white">System;
</span><span style="background: black; color: #cc7832">using </span><span style="background: black; color: white">System.Collections.Generic;
</span><span style="background: black; color: #cc7832">using </span><span style="background: black; color: white">System.Linq;
</span><span style="background: black; color: #cc7832">using </span><span style="background: black; color: white">System.Web;
</span><span style="background: black; color: #cc7832">using </span><span style="background: black; color: white">System.Web.Mvc;
</span><span style="background: black; color: #cc7832">using </span><span style="background: black; color: white">System.Web.Routing;

</span><span style="background: black; color: #cc7832">namespace </span><span style="background: black; color: white">MVCApplication1
{
    </span><span style="background: black; color: #cc7832">public class </span><span style="background: black; color: #ffc66d">MvcApplication </span><span style="background: black; color: white">: System.Web.HttpApplication
    {
        </span><span style="background: black; color: #cc7832">public static void </span><span style="background: black; color: white">RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute(</span><span style="background: black; color: #a5c25c">&quot;{resource}.axd/{*pathInfo}&quot;</span><span style="background: black; color: white">);

            routes.MapRoute(
                </span><span style="background: black; color: #a5c25c">&quot;Default&quot;</span><span style="background: black; color: white">,                                              </span><span style="background: black; color: gray">// Route name
                </span><span style="background: black; color: #a5c25c">&quot;{controller}/{action}/{id}&quot;</span><span style="background: black; color: white">,                           </span><span style="background: black; color: gray">// URL with parameters
                </span><span style="background: black; color: #cc7832">new </span><span style="background: black; color: white">{ controller = </span><span style="background: black; color: #a5c25c">&quot;Home&quot;</span><span style="background: black; color: white">, action = </span><span style="background: black; color: #a5c25c">&quot;Index&quot;</span><span style="background: black; color: white">, id = </span><span style="background: black; color: #a5c25c">&quot;&quot; </span><span style="background: black; color: white">}, </span><span style="background: black; color: gray">// Parameter defaults
                </span><span style="background: black; color: #cc7832">new </span><span style="background: black; color: white">{ controller = </span><span style="background: black; color: #a31515">@&quot;[^\.]*&quot; </span><span style="background: black; color: white">}
            );

            routes.MapRoute(
                </span><span style="background: black; color: #a5c25c">&quot;Defaultmvc&quot;</span><span style="background: black; color: white">,                                               </span><span style="background: black; color: gray">// Route name
                </span><span style="background: black; color: #a5c25c">&quot;{controller}.mvc/{action}/{id}&quot;</span><span style="background: black; color: white">,                           </span><span style="background: black; color: gray">// URL with parameters
                </span><span style="background: black; color: #cc7832">new </span><span style="background: black; color: white">{ controller = </span><span style="background: black; color: #a5c25c">&quot;Home&quot;</span><span style="background: black; color: white">, action = </span><span style="background: black; color: #a5c25c">&quot;Index&quot;</span><span style="background: black; color: white">, id = </span><span style="background: black; color: #a5c25c">&quot;&quot; </span><span style="background: black; color: white">},     </span><span style="background: black; color: gray">// Parameter defaults
                </span><span style="background: black; color: #cc7832">new </span><span style="background: black; color: white">{ controller = </span><span style="background: black; color: #a31515">@&quot;[^\.]*&quot; </span><span style="background: black; color: white">}
            );
        }

        </span><span style="background: black; color: #cc7832">protected void </span><span style="background: black; color: white">Application_Start()
        {
            RegisterRoutes(RouteTable.Routes);
        }
    }
}</span></pre>
</td>
</tr>
</tbody>
</table>
<p><strong>Note:</strong>&#160; The line with this on it -&gt; new { controller = @&quot;[^\.]*&quot; }&#160;&#160; is very important. The routes won&#8217;t work without it. </p>
<p>And that&#8217;s it! You&#8217;re done.<br />
  <br />Personally I like the last option but if you have no access to your hosting web server then Option 2 is probably the best.</p>
<p>Schotime</p>
]]></content:encoded>
			<wfw:commentRss>http://schotime.net/blog/index.php/2008/10/18/running-aspnet-mvc-applications-under-iis6/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		<feedburner:origLink>http://schotime.net/blog/index.php/2008/10/18/running-aspnet-mvc-applications-under-iis6/</feedburner:origLink></item>
		<item>
		<title>Dataset, Datatable to Json</title>
		<link>http://feedproxy.google.com/~r/Schotime/~3/Vs3BINmMpug/</link>
		<comments>http://schotime.net/blog/index.php/2008/07/27/dataset-datatable-to-json/#comments</comments>
		<pubDate>Sun, 27 Jul 2008 05:51:36 +0000</pubDate>
		<dc:creator>Schotime</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[Json]]></category>

		<guid isPermaLink="false">http://schotime.net/blog/index.php/2008/07/27/dataset-datatable-to-json/</guid>
		<description><![CDATA[After my previous posts about returning data to the client as a JSON object, I decided to have a go at returning a generic Datatable/Dataset. This however is not as easy as simple returning a Datatable in your code behind method or web service. There is a solution though and here it is.
If you break [...]]]></description>
			<content:encoded><![CDATA[<p>After my previous posts about returning data to the client as a JSON object, I decided to have a go at returning a generic Datatable/Dataset. This however is not as easy as simple returning a Datatable in your code behind method or web service. There is a solution though and here it is.</p>
<p>If you break a Datatable down it is really only a List of Dictionary objects so that&#8217;s how we&#8217;ll approach this problem. This is compatible with .NET 2.0 and above, with the Ajax installed.</p>
<p>I&#8217;d like to acknowledge <a href="http://www.trinet.co.uk/" target="_blank" onclick="pageTracker._trackPageview('/outgoing/www.trinet.co.uk/?referer=');">RichardD</a> for the idea.</p>
<p>Below is the solution.</p>
<table cellspacing="0" cellpadding="2" width="400" border="1">
<tbody>
<tr>
<td valign="top" width="400">
<pre class="code"><span style="color: blue">using </span>System.Collections.Generic;
<span style="color: blue">using </span>System.Data;

<span style="color: blue">public static class </span><span style="color: #2b91af">JsonMethods
</span>{
    <span style="color: blue">private static </span><span style="color: #2b91af">List</span>&lt;<span style="color: #2b91af">Dictionary</span>&lt;<span style="color: blue">string</span>, <span style="color: blue">object</span>&gt;&gt;
        RowsToDictionary(<span style="color: #2b91af">DataTable </span>table)
    {
        <span style="color: #2b91af">List</span>&lt;<span style="color: #2b91af">Dictionary</span>&lt;<span style="color: blue">string</span>, <span style="color: blue">object</span>&gt;&gt; objs =
            <span style="color: blue">new </span><span style="color: #2b91af">List</span>&lt;<span style="color: #2b91af">Dictionary</span>&lt;<span style="color: blue">string</span>, <span style="color: blue">object</span>&gt;&gt;();
        <span style="color: blue">foreach </span>(<span style="color: #2b91af">DataRow </span>dr <span style="color: blue">in </span>table.Rows)
        {
            <span style="color: #2b91af">Dictionary</span>&lt;<span style="color: blue">string</span>, <span style="color: blue">object</span>&gt; drow = <span style="color: blue">new </span><span style="color: #2b91af">Dictionary</span>&lt;<span style="color: blue">string</span>, <span style="color: blue">object</span>&gt;();
            <span style="color: blue">for </span>(<span style="color: blue">int </span>i = 0; i &lt; table.Columns.Count; i++)
            {
                drow.Add(table.Columns[i].ColumnName, dr[i]);
            }
            objs.Add(drow);
        }

        <span style="color: blue">return </span>objs;
    }

    <span style="color: blue">public static </span><span style="color: #2b91af">Dictionary</span>&lt;<span style="color: blue">string</span>, <span style="color: blue">object</span>&gt; ToJson(<span style="color: #2b91af">DataTable </span>table)
    {
        <span style="color: #2b91af">Dictionary</span>&lt;<span style="color: blue">string</span>, <span style="color: blue">object</span>&gt; d = <span style="color: blue">new </span><span style="color: #2b91af">Dictionary</span>&lt;<span style="color: blue">string</span>, <span style="color: blue">object</span>&gt;();
        d.Add(table.TableName, RowsToDictionary(table));
        <span style="color: blue">return </span>d;
    }

    <span style="color: blue">public static </span><span style="color: #2b91af">Dictionary</span>&lt;<span style="color: blue">string</span>, <span style="color: blue">object</span>&gt; ToJson(<span style="color: #2b91af">DataSet </span>data)
    {
        <span style="color: #2b91af">Dictionary</span>&lt;<span style="color: blue">string</span>, <span style="color: blue">object</span>&gt; d = <span style="color: blue">new </span><span style="color: #2b91af">Dictionary</span>&lt;<span style="color: blue">string</span>, <span style="color: blue">object</span>&gt;();
        <span style="color: blue">foreach </span>(<span style="color: #2b91af">DataTable </span>table <span style="color: blue">in </span>data.Tables)
        {
            d.Add(table.TableName, RowsToDictionary(table));
        }
        <span style="color: blue">return </span>d;
    }
}</pre>
</td>
</tr>
</tbody>
</table>
<p>The static class JsonMethods exposes two public static methods and a private method. The public method ToJson() takes either a Dataset or a Datatable, and returns a Dictionary&lt;string,object&gt; object. The key to this class is the RowsToDictionary() method. </p>
<p>This method iterates through all the rows creating a dictionary entry for each column in the row using the column name as the key and storing the data value into the object. It then adds the Dictionary object to a List of Dictionary Objects and returns this to the ToJson() method. This Dictionary list is then added to another Dictionary object using the table name as the key. We&#8217;ll see how this all works together soon.</p>
<p>Lets have a look at the code behind now.</p>
<table cellspacing="0" cellpadding="2" width="400" border="1">
<tbody>
<tr>
<td valign="top" width="400">
<pre class="code">[System.Web.Script.Services.<span style="color: #2b91af">ScriptMethod</span>(ResponseFormat = <span style="color: #2b91af">ResponseFormat</span>.Json)]
[System.Web.Services.<span style="color: #2b91af">WebMethod</span>]
<span style="color: blue">public static </span><span style="color: #2b91af">Dictionary</span>&lt;<span style="color: blue">string</span>, <span style="color: blue">object</span>&gt; getTable()
{
    <span style="color: blue">string </span>sql = <span style="color: #a31515">&quot;select user_name, active_indicator, create_date from users&quot;</span>;
    <span style="color: blue">string </span>connString = <span style="color: #a31515">&quot;database=db; server=localhost; user id=sa;&quot;</span>;

    <span style="color: blue">return </span><span style="color: #2b91af">JsonMethods</span>.ToJson(GetDataTable(sql, connString));
}

<span style="color: blue">private static </span><span style="color: #2b91af">DataTable </span>GetDataTable(<span style="color: blue">string </span>sql, <span style="color: blue">string </span>connString)
{
    <span style="color: blue">using </span>(<span style="color: #2b91af">SqlConnection </span>myConnection = <span style="color: blue">new </span><span style="color: #2b91af">SqlConnection</span>(connString))
    {
        <span style="color: blue">using </span>(<span style="color: #2b91af">SqlCommand </span>myCommand = <span style="color: blue">new </span><span style="color: #2b91af">SqlCommand</span>(sql, myConnection))
        {
            myConnection.Open();
            <span style="color: blue">using </span>(<span style="color: #2b91af">SqlDataReader </span>myReader = myCommand.ExecuteReader())
            {
                <span style="color: #2b91af">DataTable </span>myTable = <span style="color: blue">new </span><span style="color: #2b91af">DataTable</span>();
                myTable.TableName = <span style="color: #a31515">&quot;mydt&quot;</span>;
                myTable.Load(myReader);
                myConnection.Close();
                <span style="color: blue">return </span>myTable;
            }
        }
    }
}</pre>
</td>
</tr>
</tbody>
</table>
<p>So what I have above is two static methods. One is GetTable which is the one we will access from the client. The other is a generic method for loading a results set into a Datatable. Note how I have set the TableName property. You will see why soon.</p>
<p>So using the <a href="http://schotime.net/blog/index.php/2008/07/01/jquery-plugin-for-aspnet-ajax-jmsajax/" target="_blank">jMsAjax plugin</a> as below will return the following JSON object.</p>
<table cellspacing="0" cellpadding="2" width="400" border="1">
<tbody>
<tr>
<td valign="top" width="400">
<pre class="code">$.jmsajax({
    type: <span style="color: #a31515">&quot;POST&quot;</span>,
    url: <span style="color: #a31515">&quot;Default.aspx&quot;</span>,
    method: <span style="color: #a31515">&quot;getTable&quot;</span>,
    data: {},
    dataType: <span style="color: #a31515">&quot;msjson&quot;</span>,
    success: <span style="color: blue">function</span>(data) {
        $(outputDT(data.mydt)).appendTo(<span style="color: #a31515">&quot;body&quot;</span>);
    }
});</pre>
</td>
</tr>
</tbody>
</table>
<p>Results (data):<br />
  </p>
<table cellspacing="0" cellpadding="2" width="640" border="1">
<tbody>
<tr>
<td valign="top" width="638">
<p><span style="font-size: 11px; font-family: courier new">{&quot;mydt&quot;:{&quot;user_name&quot;:&quot;000001&quot;,&quot;active_indicator&quot;:&quot;Y&quot;,&quot;create_date&quot;:&quot;\/Date(1170892765197)\/&quot;}, {&quot;user_name&quot;:&quot;000002&quot;,&quot;active_indicator&quot;:&quot;Y&quot;,&quot;create_date&quot;:&quot;\/Date(1170892765197)\/&quot;}]}</span> </p>
</td>
</tr>
</tbody>
</table>
<p>In the resulting data, the table name is the key to referencing the array of values. In this case we use &#8216;mydt&#8217; as the key. In the success function on the client request you may also notice an outputDT function. This is a little helper function which takes a JSON Datatable and returns a the results in a table. This is very useful for debugging. Here is the client side code.</p>
<table cellspacing="0" cellpadding="2" width="400" border="1">
<tbody>
<tr>
<td valign="top" width="400">
<pre class="code"><span style="color: blue">function </span>outputDT(dataTable)
{
    <span style="color: blue">var </span>headers = [];
    <span style="color: blue">var </span>rows = [];

    headers.push(<span style="color: #a31515">&quot;&lt;tr&gt;&quot;</span>);
    <span style="color: blue">for </span>(<span style="color: blue">var </span>name <span style="color: blue">in </span>dataTable[0])
        headers.push(<span style="color: #a31515">&quot;&lt;td&gt;&lt;b&gt;&quot;</span>+name+<span style="color: #a31515">&quot;&lt;/b&gt;&lt;/td&gt;&quot;</span>);
    headers.push(<span style="color: #a31515">&quot;&lt;/tr&gt;&quot;</span>);

    <span style="color: blue">for </span>(<span style="color: blue">var </span>row <span style="color: blue">in </span>dataTable)
    {
        rows.push(<span style="color: #a31515">&quot;&lt;tr&gt;&quot;</span>);
        <span style="color: blue">for </span>(<span style="color: blue">var </span>name <span style="color: blue">in </span>dataTable[row])
        {
            rows.push(<span style="color: #a31515">&quot;&lt;td&gt;&quot;</span>);
            rows.push(dataTable[row][name]);
            rows.push(<span style="color: #a31515">&quot;&lt;/td&gt;&quot;</span>);
        }
        rows.push(<span style="color: #a31515">&quot;&lt;/tr&gt;&quot;</span>);
    }            

    <span style="color: blue">var </span>top = <span style="color: #a31515">&quot;&lt;table border='1'&gt;&quot;</span>;
    <span style="color: blue">var </span>bottom = <span style="color: #a31515">&quot;&lt;/table&gt;&quot;</span>;  

    <span style="color: blue">return </span>top + headers.join(<span style="color: #a31515">&quot;&quot;</span>) + rows.join(<span style="color: #a31515">&quot;&quot;</span>) + bottom;
}</pre>
</td>
</tr>
</tbody>
</table>
<p>So as you can see, its now very easy to return a Datatable or Dataset as a JSON object ready for use on the client.</p>
<p>Hope this is as useful for you as it is for me.</p>
<p>Cheers,<br />
  <br />Schotime </p>
]]></content:encoded>
			<wfw:commentRss>http://schotime.net/blog/index.php/2008/07/27/dataset-datatable-to-json/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		<feedburner:origLink>http://schotime.net/blog/index.php/2008/07/27/dataset-datatable-to-json/</feedburner:origLink></item>
	</channel>
</rss>
