<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	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/"
	>

<channel>
	<title>Schotime.net &#187; ASP.NET MVC</title>
	<atom:link href="http://schotime.net/blog/index.php/tag/asp-net-mvc/feed/" rel="self" type="application/rss+xml" />
	<link>http://schotime.net/blog</link>
	<description>All Things .Net and Me</description>
	<lastBuildDate>Thu, 01 Jul 2010 14:42:28 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Dynamic Dot Less Css With Asp.net MVC 2</title>
		<link>http://schotime.net/blog/index.php/2010/07/02/dynamic-dot-less-css-with-asp-net-mvc-2/</link>
		<comments>http://schotime.net/blog/index.php/2010/07/02/dynamic-dot-less-css-with-asp-net-mvc-2/#comments</comments>
		<pubDate>Thu, 01 Jul 2010 14:33:27 +0000</pubDate>
		<dc:creator>Schotime</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[ASP.NET MVC]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[dotLess]]></category>

		<guid isPermaLink="false">http://schotime.net/blog/index.php/2010/07/02/dynamic-dot-less-css-with-asp-net-mvc-2/</guid>
		<description><![CDATA[I have been having a look at the best way to theme a asp.net mvc website in the last few weeks. I heard about dot less css late last year but hadn’t had time to integrate it into a project until now. Integrating dot less css is pretty easy by default, as shown on its [...]]]></description>
			<content:encoded><![CDATA[<p>I have been having a look at the best way to theme a asp.net mvc website in the last few weeks. I heard about <a href="http://dotlesscss.com" target="_blank" onclick="pageTracker._trackPageview('/outgoing/dotlesscss.com?referer=');">dot less css</a> late last year but hadn’t had time to integrate it into a project until now. </p>
<p>Integrating dot less css is pretty easy by default, as shown on its home page however I wanted something that could be configured by application users. We want to be able to specify the link html tag like the following.</p>
<table cellspacing="0" cellpadding="2" width="400" border="1">
<tbody>
<tr>
<td valign="top" width="400"> 
<pre class="code"><span style="color: blue">&lt;</span><span style="color: #a31515">link </span><span style="color: red">href</span><span style="color: blue">=&quot;/public/css/sites.less&quot; </span><span style="color: red">rel</span><span style="color: blue">=&quot;stylesheet&quot; </span><span style="color: red">type</span><span style="color: blue">=&quot;text/css&quot; /&gt;</span></pre>
</td>
</tr>
</tbody>
</table>
<p>There are few steps involved in the solution I have come up with so bare with me as I go through them. Firstly we’ll start with the web.config:</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">        &lt;</span><span style="background: black; color: #cc7832">compilation</span><span style="background: black; color: white">&gt;
            &lt;</span><span style="background: black; color: #cc7832">buildProviders</span><span style="background: black; color: white">&gt;
                &lt;</span><span style="background: black; color: #cc7832">add </span><span style="background: black; color: white">extension=&quot;</span><span style="background: black; color: #a5c25c">.lessx</span><span style="background: black; color: white">&quot; type=&quot;</span><span style="background: black; color: #a5c25c">System.Web.Compilation.PageBuildProvider</span><span style="background: black; color: white">&quot; /&gt;
            &lt;/</span><span style="background: black; color: #cc7832">buildProviders</span><span style="background: black; color: white">&gt;
        &lt;/</span><span style="background: black; color: #cc7832">compilation</span><span style="background: black; color: white">&gt;</span></pre>
</td>
</tr>
</tbody>
</table>
<p>Insert the builderProviders block inside the compilation section. The compilation section will be under the system.web section. This will enable us to use code blocks in our lessx files.</p>
<p>Secondly, is the routing.</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: gray">//Special Route for css so that images are relative to it
        </span><span style="background: black; color: white">routes.MapRoute(</span><span style="background: black; color: #a5c25c">&quot;css&quot;</span><span style="background: black; color: white">,
                           </span><span style="background: black; color: #a5c25c">&quot;public/css/{filename}.less&quot;</span><span style="background: black; color: white">,
                           </span><span style="background: black; color: #cc7832">new </span><span style="background: black; color: white">{ controller = </span><span style="background: black; color: #a5c25c">&quot;Css&quot;</span><span style="background: black; color: white">, action = </span><span style="background: black; color: #a5c25c">&quot;Index” </span><span style="background: black; color: white">},
                           </span><span style="background: black; color: #cc7832">new</span><span style="background: black; color: white">[] { </span><span style="background: black; color: #a5c25c">&quot;eLearning.Controllers&quot; </span><span style="background: black; color: white">});</span></pre>
</td>
</tr>
</tbody>
</table>
<p>This specifies that any url matching /public/css/{filename}.less should be routed to the CssController passing the filename as the parameter to the Index method.</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">CssController </span><span style="background: black; color: white">: </span><span style="background: black; color: #ffc66d">BaseController
    </span><span style="background: black; color: white">{
        [</span><span style="background: black; color: #ffc66d">OutputCache</span><span style="background: black; color: white">(Duration = </span><span style="background: black; color: #6897bb">10</span><span style="background: black; color: white">, VaryByParam = </span><span style="background: black; color: #a5c25c">&quot;&quot;</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">string </span><span style="background: black; color: white">filename)
        {
            </span><span style="background: black; color: #cc7832">if </span><span style="background: black; color: white">(</span><span style="background: black; color: #cc7832">string</span><span style="background: black; color: white">.IsNullOrEmpty(filename))
                </span><span style="background: black; color: #cc7832">throw new </span><span style="background: black; color: #ffc66d">ArgumentException</span><span style="background: black; color: white">(</span><span style="background: black; color: #a5c25c">&quot;A filename must be supplied&quot;</span><span style="background: black; color: white">);

            ViewData[</span><span style="background: black; color: #a5c25c">&quot;baseColor&quot;</span><span style="background: black; color: white">] = </span><span style="background: black; color: #a5c25c">&quot;#aabbcc&quot;</span><span style="background: black; color: white">;

            </span><span style="background: black; color: #cc7832">var </span><span style="background: black; color: white">less = RenderViewToString(filename + </span><span style="background: black; color: #a5c25c">&quot;.lessx&quot;</span><span style="background: black; color: white">, </span><span style="background: black; color: #cc7832">null</span><span style="background: black; color: white">);
            </span><span style="background: black; color: #cc7832">var </span><span style="background: black; color: white">css = </span><span style="background: black; color: #ffc66d">LessCss</span><span style="background: black; color: white">.Generate(less, </span><span style="background: black; color: #cc7832">true</span><span style="background: black; color: white">);
            </span><span style="background: black; color: #cc7832">return </span><span style="background: black; color: white">Content(css, </span><span style="background: black; color: #a5c25c">&quot;text/css&quot;</span><span style="background: black; color: white">);
        }
    }

    </span><span style="background: black; color: #cc7832">public static class </span><span style="background: black; color: #ffc66d">LessCss
    </span><span style="background: black; color: white">{
        </span><span style="background: black; color: #cc7832">public static string </span><span style="background: black; color: white">Generate(</span><span style="background: black; color: #cc7832">string </span><span style="background: black; color: white">less, </span><span style="background: black; color: #cc7832">bool </span><span style="background: black; color: white">minify)
        {
            </span><span style="background: black; color: #cc7832">var </span><span style="background: black; color: white">lessEngine = </span><span style="background: black; color: #cc7832">new </span><span style="background: black; color: white">EngineFactory();
            lessEngine.Configuration.MinifyOutput = minify;
            </span><span style="background: black; color: #cc7832">var </span><span style="background: black; color: white">output = lessEngine.GetEngine().TransformToCss(less, </span><span style="background: black; color: #cc7832">null</span><span style="background: black; color: white">);
            </span><span style="background: black; color: #cc7832">return </span><span style="background: black; color: white">output;
        }
    }</span></pre>
</td>
</tr>
</tbody>
</table>
<p>This is the css controller class. It receives the filename as the input, finds the corresponding .lessx file and returns the file with appropriate view data replaced. Is then takes the less formatted string and runs it through the dot less parser to return a css string. This is then returned to the browser with the appropriate content-type. One method I have not shown is the RenderViewToString() and how the .lessx file is located. This method is located on the base controller class that the css controller inherits from. I have also turned Caching on so that it will cache the result for 10seconds.</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">protected string </span><span style="background: black; color: white">RenderViewToString(</span><span style="background: black; color: #cc7832">string </span><span style="background: black; color: white">viewName, </span><span style="background: black; color: #cc7832">object </span><span style="background: black; color: white">model)
        {
            </span><span style="background: black; color: #cc7832">if </span><span style="background: black; color: white">(</span><span style="background: black; color: #cc7832">string</span><span style="background: black; color: white">.IsNullOrEmpty(viewName))
                viewName = ControllerContext.RouteData.GetRequiredString(</span><span style="background: black; color: #a5c25c">&quot;action&quot;</span><span style="background: black; color: white">);

            ViewData.Model = model;

            </span><span style="background: black; color: #cc7832">using </span><span style="background: black; color: white">(</span><span style="background: black; color: #ffc66d">StringWriter </span><span style="background: black; color: white">sw = </span><span style="background: black; color: #cc7832">new </span><span style="background: black; color: #ffc66d">StringWriter</span><span style="background: black; color: white">())
            {
                </span><span style="background: black; color: #ffc66d">ViewEngineResult </span><span style="background: black; color: white">viewResult = </span><span style="background: black; color: #ffc66d">ViewEngines</span><span style="background: black; color: white">.Engines.FindView(ControllerContext, viewName, </span><span style="background: black; color: #cc7832">null</span><span style="background: black; color: white">);
                </span><span style="background: black; color: #ffc66d">ViewContext </span><span style="background: black; color: white">viewContext = </span><span style="background: black; color: #cc7832">new </span><span style="background: black; color: #ffc66d">ViewContext</span><span style="background: black; color: white">(ControllerContext, viewResult.View, ViewData, TempData, sw);
                viewResult.View.Render(viewContext, sw);

                </span><span style="background: black; color: #cc7832">return </span><span style="background: black; color: white">sw.GetStringBuilder().ToString();
            }
        }</span></pre>
</td>
</tr>
</tbody>
</table>
<p>
  <br />This method finds the .lessx file and returns the result as a string. Now usually the view engine will take controller name and method name and by convention look in the /Views/css/index.aspx file. It doesn’t quite make sense to put it in the views folder so I have overridden the default web forms view engine so that they can be placed in the /Public/Css folder. This can be configured to your liking (convention).</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">CustomViewEngine </span><span style="background: black; color: white">: </span><span style="background: black; color: #ffc66d">WebFormViewEngine
    </span><span style="background: black; color: white">{
        </span><span style="background: black; color: #cc7832">public </span><span style="background: black; color: white">CustomViewEngine()
        {
            </span><span style="background: black; color: #cc7832">var </span><span style="background: black; color: white">locs = </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: #cc7832">string</span><span style="background: black; color: white">&gt;(</span><span style="background: black; color: #cc7832">base</span><span style="background: black; color: white">.ViewLocationFormats);
            locs.Add(</span><span style="background: black; color: #a5c25c">&quot;~/Public/{1}/{0}&quot;</span><span style="background: black; color: white">); </span><span style="background: black; color: gray">//My personal choice
            </span><span style="background: black; color: white">locs.Add(</span><span style="background: black; color: #a5c25c">&quot;~/Views/{1}/{0}&quot;</span><span style="background: black; color: white">);  </span><span style="background: black; color: gray">//An alternative choice
            </span><span style="background: black; color: #cc7832">base</span><span style="background: black; color: white">.ViewLocationFormats = locs.ToArray();
        }
    }</span></pre>
</td>
</tr>
</tbody>
</table>
<p>Once your Custom View Engine has been overridden, you will need to add it to the ViewEngines.Engines collection in the application start method in the global.asax.cs.</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: #ffc66d">ViewEngines</span><span style="background: black; color: white">.Engines.Clear();
        </span><span style="background: black; color: #ffc66d">ViewEngines</span><span style="background: black; color: white">.Engines.Add(</span><span style="background: black; color: #cc7832">new </span><span style="background: black; color: #ffc66d">CustomViewEngine</span><span style="background: black; color: white">());</span></pre>
</td>
</tr>
</tbody>
</table>
<p>This will then allow us to write a *.lessx file like the following; you can also pass a strongly typed model to the .lessx file if you so wish in the same way you would to a regular aspx view.</p>
<table cellspacing="0" cellpadding="2" width="400" border="1">
<tbody>
<tr>
<td valign="top" width="400">
        </p>
<pre class="code">&lt;%@ Page Language=&quot;C#&quot; Inherits=&quot;System.Web.Mvc.ViewPage&quot; %&gt;

@basecolor: &lt;%= ViewData[&quot;baseColor&quot;] %&gt;;

body {
    background: @basecolor;
}</pre>
</td>
</tr>
</tbody>
</table>
<p>Which will be rendered to the browser as:</p>
<table cellspacing="0" cellpadding="2" width="400" border="1">
<tbody>
<tr>
<td valign="top" width="400">
        </p>
<pre class="code">body {
    background: #aabbcc;
}</pre>
</td>
</tr>
</tbody>
</table>
<p>And that’s it. I’m still working on the finer details but I am liking how it works at the moment. If you have any thoughts or suggestions, please leave a comment.</p>
<p>Adam</p>
]]></content:encoded>
			<wfw:commentRss>http://schotime.net/blog/index.php/2010/07/02/dynamic-dot-less-css-with-asp-net-mvc-2/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>FluentValidation Xval Integration</title>
		<link>http://schotime.net/blog/index.php/2009/06/13/fluentvalidation-xval-integration/</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>4</slash:comments>
		</item>
		<item>
		<title>Fluent Validation Model Binder &#8211; Asp.net MVC</title>
		<link>http://schotime.net/blog/index.php/2009/05/11/fluent-validation-model-binder-aspnet-mvc/</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 [...]]]></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>2</slash:comments>
		</item>
	</channel>
</rss>
