<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-5201357166850736293</id><updated>2011-12-29T02:37:40.689-08:00</updated><category term='64-bit Windows 7'/><category term='URL Routing'/><category term='IZWebFileManager'/><category term='Gendarme'/><category term='jQuery'/><category term='IIS 7'/><category term='tools'/><category term='WebMatrix'/><category term='formatting'/><category term='ASP'/><category term='MSBuild'/><category term='NHProf'/><category term='S#arp Arcitecture'/><category term='ASP.NET MVC'/><category term='ASP.NET'/><category term='C#'/><category term='PHP'/><category term='DateTime'/><category term='ASP.NET Web Pages'/><category term='NHibernate'/><category term='Mono'/><category term='MySql'/><category term='ODBC'/><category term='CGI'/><category term='IronPython'/><category term='JavaScript'/><category term='NAnt'/><title type='text'>Igor Zelmanovich's Blog</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://igorzelmanovich.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5201357166850736293/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://igorzelmanovich.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Igor Zelmanovich</name><uri>https://profiles.google.com/105271231664740991104</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-vJdYr2PbajQ/AAAAAAAAAAI/AAAAAAAAAAA/1iMFigbWLPc/s512-c/photo.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>27</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-5201357166850736293.post-275326955528499068</id><published>2011-11-14T21:41:00.001-08:00</published><updated>2011-11-14T23:29:54.093-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><title type='text'>Use ASP.NET Resource strings from within javascript files</title><content type='html'>It seems to be a common issue.&lt;br /&gt;&lt;br /&gt;ASP.NET allows you to use resource files (*.resx) to localize content of pages (or views, if we are in context of ASP.NET MVC). All what you need is to put resource files under &lt;i&gt;~/App_GlobalResources&lt;/i&gt; folder and use either resource expression or&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;i&gt;HttpContext.GetGlobalResourceObject()&lt;/i&gt; API to get a proper string. It is well &lt;a href="http://msdn.microsoft.com/en-us/library/ms228208.aspx"&gt;documented on MSDN&lt;/a&gt;. The only issue - this API is not accessible within static resources such JavaScript files.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;There are several solution already described by different people: Martin Normark's solution is &lt;a href="http://martinnormark.com/making-your-asp-net-global-resource-files-work-in-javascript-intellisense-included"&gt;generating static JavaScript resource files on post-build&lt;/a&gt;, Mads Kristensen suggest to &lt;a href="http://madskristensen.net/post/Localize-text-in-JavaScript-files-in-ASPNET.aspx"&gt;localize text in JavaScript files by string replacing&lt;/a&gt;, and finally Rick Strahl introduce &lt;a href="http://www.west-wind.com/weblog/posts/2009/Apr/02/A-Localization-Handler-to-serve-ASPNET-Resources-to-JavaScript"&gt;a localization handler to serve ASP.NET resources to JavaScript.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The last solution looks most elegant for me. Since I am working only with global resources I just simplified his solution and ended up with my own:&lt;br /&gt;&lt;br /&gt;&lt;pre style="background: none repeat scroll 0% 0% white; color: black; font-family: Consolas; font-size: 13px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;class&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;JavaScriptResourceHandler&lt;/span&gt;&amp;nbsp;:&amp;nbsp;&lt;span style="color: #2b91af;"&gt;IHttpHandler&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;void&lt;/span&gt;&amp;nbsp;ProcessRequest(&lt;span style="color: #2b91af;"&gt;HttpContext&lt;/span&gt;&amp;nbsp;context)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;var&lt;/span&gt;&amp;nbsp;requestedCulture&amp;nbsp;=&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;CultureInfo&lt;/span&gt;(context.Request.QueryString[&lt;span style="color: #a31515;"&gt;"locale"&lt;/span&gt;]);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;var&lt;/span&gt;&amp;nbsp;classKey&amp;nbsp;=&amp;nbsp;context.Request.QueryString[&lt;span style="color: #a31515;"&gt;"classKey"&lt;/span&gt;];&lt;br /&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;var&lt;/span&gt;&amp;nbsp;dictionary&amp;nbsp;=&amp;nbsp;ReadResources(classKey,&amp;nbsp;requestedCulture);&lt;br /&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;var&lt;/span&gt;&amp;nbsp;javaScriptSerializer&amp;nbsp;=&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;JavaScriptSerializer&lt;/span&gt;();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;var&lt;/span&gt;&amp;nbsp;script&amp;nbsp;=&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #a31515;"&gt;@"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #a31515;"&gt;if&amp;nbsp;(typeof(Resources)&amp;nbsp;==&amp;nbsp;""undefined"")&amp;nbsp;Resources&amp;nbsp;=&amp;nbsp;{};&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #a31515;"&gt;Resources."&lt;/span&gt;&amp;nbsp;+&amp;nbsp;classKey&amp;nbsp;+&amp;nbsp;&lt;span style="color: #a31515;"&gt;"&amp;nbsp;=&amp;nbsp;"&lt;/span&gt;&amp;nbsp;+&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;javaScriptSerializer.Serialize(dictionary)&amp;nbsp;+&amp;nbsp;&lt;span style="color: #a31515;"&gt;";"&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;context.Response.ContentType&amp;nbsp;=&amp;nbsp;&lt;span style="color: #a31515;"&gt;"application/javascript"&lt;/span&gt;;&lt;br /&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;context.Response.Expires&amp;nbsp;=&amp;nbsp;43200;&amp;nbsp;&lt;span style="color: green;"&gt;//&amp;nbsp;30&amp;nbsp;days&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;context.Response.Cache.SetLastModified(&lt;span style="color: #2b91af;"&gt;DateTime&lt;/span&gt;.UtcNow);&lt;br /&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;context.Response.Write(script);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;bool&lt;/span&gt;&amp;nbsp;IsReusable&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;get&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;false&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Dictionary&lt;/span&gt;&amp;lt;&lt;span style="color: blue;"&gt;object&lt;/span&gt;&amp;nbsp;,&lt;span style="color: blue;"&gt;object&lt;/span&gt;&amp;gt;&amp;nbsp;ReadResources(&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;nbsp;classKey,&lt;span style="color: #2b91af;"&gt;&lt;br /&gt;                                                           CultureInfo&lt;/span&gt;&amp;nbsp;requestedCulture&amp;nbsp;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;var&lt;/span&gt;&amp;nbsp;resourceManager&amp;nbsp;=&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;ResourceManager&lt;/span&gt;(&lt;span style="color: #a31515;"&gt;"Resources."&lt;/span&gt;&amp;nbsp;+&amp;nbsp;classKey,&lt;span style="color: #2b91af;"&gt;&lt;br /&gt;                                                Assembly&lt;/span&gt;.Load(&lt;span style="color: #a31515;"&gt;"App_GlobalResources"&lt;/span&gt;));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;using&lt;/span&gt;&amp;nbsp;(&lt;span style="color: blue;"&gt;var&lt;/span&gt;&amp;nbsp;resourceSet&amp;nbsp;= &lt;br /&gt;                resourceManager.GetResourceSet(&lt;span style="color: #2b91af;"&gt;CultureInfo&lt;/span&gt;.InvariantCulture,&amp;nbsp;&lt;span style="color: blue;"&gt;true&lt;/span&gt;,&amp;nbsp;&lt;span style="color: blue;"&gt;true&lt;/span&gt;))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;return&lt;/span&gt;&amp;nbsp;resourceSet&lt;br /&gt;                    .Cast&amp;lt;&lt;span style="color: #2b91af;"&gt;DictionaryEntry&lt;/span&gt;&amp;gt;()&lt;br /&gt;                    .ToDictionary(x&amp;nbsp;=&amp;gt; x.Key,&lt;br /&gt;                         x&amp;nbsp;=&amp;gt; resourceManager.GetObject((&lt;span style="color: blue;"&gt;string&lt;/span&gt;)x.Key,&amp;nbsp;requestedCulture));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/pre&gt;&lt;pre style="background: none repeat scroll 0% 0% white; color: black; font-family: Consolas; font-size: 13px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="background: none repeat scroll 0% 0% white; color: black; font-family: Consolas; font-size: 13px;"&gt;&lt;/pre&gt;The demo project running this code might be found at Googe Code: &lt;a href="http://code.google.com/p/izlabs/source/browse/#svn%2Ftrunk%2FJavaScriptResourceHandler"&gt;http://code.google.com/p/izlabs/source/browse/#svn%2Ftrunk%2FJavaScriptResourceHandler&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5201357166850736293-275326955528499068?l=igorzelmanovich.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://igorzelmanovich.blogspot.com/feeds/275326955528499068/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://igorzelmanovich.blogspot.com/2011/11/use-aspnet-resource-strings-from-within.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5201357166850736293/posts/default/275326955528499068'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5201357166850736293/posts/default/275326955528499068'/><link rel='alternate' type='text/html' href='http://igorzelmanovich.blogspot.com/2011/11/use-aspnet-resource-strings-from-within.html' title='Use ASP.NET Resource strings from within javascript files'/><author><name>Igor Zelmanovich</name><uri>https://profiles.google.com/105271231664740991104</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-vJdYr2PbajQ/AAAAAAAAAAI/AAAAAAAAAAA/1iMFigbWLPc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5201357166850736293.post-6979664721453844450</id><published>2011-08-01T02:11:00.000-07:00</published><updated>2011-08-01T02:15:52.741-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><title type='text'>Write custom ASP.NET HTTP Handler using JavaScript</title><content type='html'>JavaScript is extremely popular language and already has implementations for server-side programming. For example &lt;a href="http://nodejs.org/"&gt;Node.js&lt;/a&gt;&amp;nbsp; - a server-side JavaScript environment that utilizes Goggle's &lt;a href="http://code.google.com/p/v8/"&gt;V8 JavaScript Engine&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I am an ASP.NET developer and want to use JavaScript in the ASP.NET environment. I found&lt;a href="http://javascriptdotnet.codeplex.com/"&gt; Javascript .NET&lt;/a&gt; project, that bring Google's V8 to the .NET world and I started with a simple task - to write a custom ASP.NET HTTP Handler using JavaScript. (I had done &lt;a href="http://igorzelmanovich.blogspot.com/2010/11/write-custom-aspnet-http-handler-with.html"&gt;similar task with IronPython&lt;/a&gt; before)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Setup requirements&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;1. I want *.js file to be processed on server (like *.aspx or *.ashx)&lt;br /&gt;2. I want to access server side objects (such HttpContext, HttpRequest and HttpResponse) from javascript code.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Implementation&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;First of all, download &lt;a class="SelectedRelease" href="http://javascriptdotnet.codeplex.com/" id="ReleaseLinkStable0" title="Recommended Release: Javascript .NET v0.4"&gt;Javascript .NET&lt;/a&gt; and add the reference to Noesis.Javascript.dll. It embeds Google's V8 and contains an API required to run JavaScript code&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-cX03YTr1g00/TjZh_KVCyRI/AAAAAAAALNE/h7UflLMSluk/s1600/2011-08-01+11h20_21.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-cX03YTr1g00/TjZh_KVCyRI/AAAAAAAALNE/h7UflLMSluk/s1600/2011-08-01+11h20_21.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Setup custom HTTP Handler in web.config. It will handle any request of *.js file under App folder. I configure it this way to allow other javascript files (not under App folder) to be processed as static content for being used in browser.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-RP3eDupl-fs/TjZXyWPiGjI/AAAAAAAALM4/ai1bTVP0ncU/s1600/2011-08-01%2B10h27_14.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-RP3eDupl-fs/TjZXyWPiGjI/AAAAAAAALM4/ai1bTVP0ncU/s1600/2011-08-01%2B10h27_14.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Next step - create App folder and&amp;nbsp; HelloWorld.js file:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-HowrTrFMODg/TjZX2TfMfvI/AAAAAAAALNA/9ZpMpd_mozU/s1600/2011-08-01%2B10h28_06.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-HowrTrFMODg/TjZX2TfMfvI/AAAAAAAALNA/9ZpMpd_mozU/s1600/2011-08-01%2B10h28_06.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Write the single line code:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/--q_2r5cys0w/TjZkLtQyKGI/AAAAAAAALNQ/DoKnUhXUJgg/s1600/2011-08-01+11h30_19.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/--q_2r5cys0w/TjZkLtQyKGI/AAAAAAAALNQ/DoKnUhXUJgg/s1600/2011-08-01+11h30_19.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;br /&gt;At this moment I expect this code run on server and produce simple 'Hello World!' html.&lt;br /&gt;But to make it works I have to implement JavaScriptHttpHandlerFactory - the core of all this. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;JavaScriptHttpHandlerFactory&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Implementation is listed below:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;using System.IO;&lt;br /&gt;using System.Web;&lt;br /&gt;using Noesis.Javascript;&lt;br /&gt;&lt;br /&gt;namespace Web&lt;br /&gt;{&lt;br /&gt;    public class JavaScriptHttpHandlerFactory : IHttpHandlerFactory&lt;br /&gt;    {&lt;br /&gt;        public IHttpHandler GetHandler(HttpContext context, &lt;br /&gt;                   string requestType, string url, string pathTranslated)&lt;br /&gt;        {&lt;br /&gt;            return new JavaScriptHttpHandler(pathTranslated);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public void ReleaseHandler(IHttpHandler handler)&lt;br /&gt;        {&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public class JavaScriptHttpHandler : IHttpHandler&lt;br /&gt;    {&lt;br /&gt;        private readonly string pathTranslated;&lt;br /&gt;&lt;br /&gt;        public JavaScriptHttpHandler(string pathTranslated)&lt;br /&gt;        {&lt;br /&gt;            this.pathTranslated = pathTranslated;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public void ProcessRequest(HttpContext context)&lt;br /&gt;        {&lt;br /&gt;            var scriptCode = File.ReadAllText(pathTranslated);&lt;br /&gt;&lt;br /&gt;            using (var jsContext = new JavascriptContext())&lt;br /&gt;            {&lt;br /&gt;                jsContext.SetParameter("context", context);&lt;br /&gt;                jsContext.SetParameter("request", context.Request);&lt;br /&gt;                jsContext.SetParameter("response", context.Response);&lt;br /&gt;&lt;br /&gt;                try&lt;br /&gt;                {&lt;br /&gt;                    jsContext.Run(scriptCode);&lt;br /&gt;                }&lt;br /&gt;                catch (JavascriptException ex)&lt;br /&gt;                {&lt;br /&gt;                    throw new HttpParseException(ex.Message, ex, &lt;br /&gt;                      pathTranslated, scriptCode, ex.Line);&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public bool IsReusable&lt;br /&gt;        {&lt;br /&gt;            get { return false; }&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;As you may see, implementation of JavaScriptHttpHandlerFactory is pretty simple. Read the js file, create JavascriptContext, setup context parameters and finally execute.&lt;br /&gt;&lt;br /&gt;Now when you run HelloWorld.js you get "Hello World!" in browser:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-urCn1croTtg/TjZmzZpGwaI/AAAAAAAALNU/0b7QBSlntMs/s1600/2011-08-01+11h41_31.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-urCn1croTtg/TjZmzZpGwaI/AAAAAAAALNU/0b7QBSlntMs/s1600/2011-08-01+11h41_31.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;Error handling&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;But all of this worth nothing if we are not able to debug javascript easily.&lt;br /&gt;Javascript.NET allows us to handle javascript errors and even points to source code line where error was occurred.&lt;br /&gt;&lt;br /&gt;I used this feature to expose a javascript error in convenient format of "yellow screen of death":&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-Qkh9r3yZ-OE/TjZrG4dLcXI/AAAAAAAALNc/uk93n6GktOk/s1600/2011-08-01+11h58_42.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-Qkh9r3yZ-OE/TjZrG4dLcXI/AAAAAAAALNc/uk93n6GktOk/s1600/2011-08-01+11h58_42.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-vXGCE_ficO4/TjZqfaIEXuI/AAAAAAAALNY/63OivaHqQ8Q/s1600/2011-08-01+11h57_03.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;br /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Conclusion&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Integration of JavaScript into ASP.NET environment is possible and not so hard&lt;br /&gt;&lt;br /&gt;BTW, Javascript.NET is not only technology allows it. There is &lt;a href="https://github.com/fholm/IronJS"&gt;IronJS&lt;/a&gt; wich runs javascript over DLR. May be in one next posts will play with it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5201357166850736293-6979664721453844450?l=igorzelmanovich.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://igorzelmanovich.blogspot.com/feeds/6979664721453844450/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://igorzelmanovich.blogspot.com/2011/08/write-custom-aspnet-http-handler-using.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5201357166850736293/posts/default/6979664721453844450'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5201357166850736293/posts/default/6979664721453844450'/><link rel='alternate' type='text/html' href='http://igorzelmanovich.blogspot.com/2011/08/write-custom-aspnet-http-handler-using.html' title='Write custom ASP.NET HTTP Handler using JavaScript'/><author><name>Igor Zelmanovich</name><uri>https://profiles.google.com/105271231664740991104</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-vJdYr2PbajQ/AAAAAAAAAAI/AAAAAAAAAAA/1iMFigbWLPc/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-cX03YTr1g00/TjZh_KVCyRI/AAAAAAAALNE/h7UflLMSluk/s72-c/2011-08-01+11h20_21.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5201357166850736293.post-1157042072524933952</id><published>2011-07-18T23:46:00.000-07:00</published><updated>2011-07-18T23:46:19.656-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jQuery'/><title type='text'>Week picker using jQuery UI Datepicker</title><content type='html'>There is my implementation of Week picker using  jQuery UI Datepicker (requers jQuery UI 1.8+).&lt;br /&gt;&lt;br /&gt;&lt;iframe src="http://jsfiddle.net/manishma/AVZJh/embedded/result/" style="height: 450px; width: 100%;"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;iframe src="http://jsfiddle.net/manishma/AVZJh/embedded/html/" style="height: 450px; width: 100%;"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;br /&gt;Html and Javascript are shared on JsFiddle &lt;a href="http://jsfiddle.net/manishma/AVZJh/"&gt;http://jsfiddle.net/manishma/AVZJh/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5201357166850736293-1157042072524933952?l=igorzelmanovich.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://igorzelmanovich.blogspot.com/feeds/1157042072524933952/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://igorzelmanovich.blogspot.com/2011/07/week-picker-using-jquery-ui-datepicker.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5201357166850736293/posts/default/1157042072524933952'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5201357166850736293/posts/default/1157042072524933952'/><link rel='alternate' type='text/html' href='http://igorzelmanovich.blogspot.com/2011/07/week-picker-using-jquery-ui-datepicker.html' title='Week picker using jQuery UI Datepicker'/><author><name>Igor Zelmanovich</name><uri>https://profiles.google.com/105271231664740991104</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-vJdYr2PbajQ/AAAAAAAAAAI/AAAAAAAAAAA/1iMFigbWLPc/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5201357166850736293.post-4009830452980801120</id><published>2011-07-14T02:51:00.000-07:00</published><updated>2011-07-14T03:01:05.730-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET Web Pages'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><title type='text'>ASP.NET Web Pages and FormAuthentication.LoginUrl configuration</title><content type='html'>Recently I had integrated ASP.NET Web Pages into existing ASP.NET Web Forms site.&lt;br /&gt;It was classic Web Forms project uses most of ASP.NET Web Forms features.&lt;br /&gt;&lt;br /&gt;And of course it uses the built-in FormAuthentication. See Web.config:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-CgU1U6yF1-4/Th6wQNRQN6I/AAAAAAAALKs/HMCvOiNBS2I/s1600/2011-07-14+11h52_18.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="59" src="http://1.bp.blogspot.com/-CgU1U6yF1-4/Th6wQNRQN6I/AAAAAAAALKs/HMCvOiNBS2I/s640/2011-07-14+11h52_18.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Any time you access 'secure' url, you get redirected to &lt;b&gt;&lt;i&gt;Login.aspx&lt;/i&gt;&lt;/b&gt; with &lt;b&gt;&lt;i&gt;ReturnUrl &lt;/i&gt;&lt;/b&gt;parameter. This worked fine for years.&lt;br /&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;There was a reason to integrate ASP.NET Web Pages into this working project. Integration itself was not painful.&amp;nbsp; First of all I upgraded the project to ASP.NET 4 and then added following setting to enable Web Pages.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-LB_MFWMWyR8/Th6wRdyjloI/AAAAAAAALK0/PL--_qaN5ME/s1600/2011-07-14+11h57_06.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-LB_MFWMWyR8/Th6wRdyjloI/AAAAAAAALK0/PL--_qaN5ME/s1600/2011-07-14+11h57_06.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;My old aspx pages and new cshtml worked fine, but it broke user authentication flow in strange way. All unauthenticated requests was redirected to &lt;b&gt;&lt;i&gt;/Account/Login &lt;/i&gt;&lt;/b&gt;instead of &lt;b&gt;&lt;i&gt;Login.aspx&lt;/i&gt;&lt;/b&gt;.&lt;br /&gt;I was shocked!!!. Where this &lt;b&gt;&lt;i&gt;/Account/Login &lt;/i&gt;&lt;/b&gt;came from?!?!&lt;br /&gt;&lt;br /&gt;Starting debugging I found that&amp;nbsp; &lt;i&gt;&lt;b&gt;FormAuthentication.LoginUrl&lt;/b&gt;&lt;/i&gt;&amp;nbsp; returns &lt;b&gt;&lt;i&gt;~/Account/Login &lt;/i&gt;&lt;/b&gt;despite configuration in Web.config. Seems someone overrides web.config settings, but why?&lt;br /&gt;&lt;br /&gt;The answer came from Reflector (this tool always helps).&lt;br /&gt;When I enabled ASP.NET Web Pages in the project, it forced &lt;b&gt;WebMatrix.WebData.dll &lt;/b&gt;being loaded, which in its turn called &lt;i&gt;&lt;b&gt;FormsAuthentication.EnableFormsAuthentication&lt;/b&gt;&lt;/i&gt; overriding existing FormAuthentication settings.&lt;br /&gt;&lt;br /&gt;Web Pages looks for &lt;i&gt;&lt;b&gt;loginUrl&lt;/b&gt;&lt;/i&gt; app setting and use a default &lt;b&gt;&lt;i&gt;~/Account/Login &lt;/i&gt;&lt;/b&gt;if no such setting found&lt;b&gt;&lt;i&gt;. &lt;/i&gt;&lt;/b&gt;I added following setting and it solved my problem:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-5ySDuA2ziJ8/Th6wRFOUouI/AAAAAAAALKw/SmjS3_PKXvA/s1600/2011-07-14+11h56_02.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-5ySDuA2ziJ8/Th6wRFOUouI/AAAAAAAALKw/SmjS3_PKXvA/s1600/2011-07-14+11h56_02.png" /&gt;&lt;/a&gt;&lt;/div&gt;I think this is a bug in ASP.NET Web Pages. Configuring loginUrl with appSettings is not clear when you already have form authentication being configured in the same Web.config.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5201357166850736293-4009830452980801120?l=igorzelmanovich.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://igorzelmanovich.blogspot.com/feeds/4009830452980801120/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://igorzelmanovich.blogspot.com/2011/07/aspnet-web-pages-and.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5201357166850736293/posts/default/4009830452980801120'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5201357166850736293/posts/default/4009830452980801120'/><link rel='alternate' type='text/html' href='http://igorzelmanovich.blogspot.com/2011/07/aspnet-web-pages-and.html' title='ASP.NET Web Pages and FormAuthentication.LoginUrl configuration'/><author><name>Igor Zelmanovich</name><uri>https://profiles.google.com/105271231664740991104</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-vJdYr2PbajQ/AAAAAAAAAAI/AAAAAAAAAAA/1iMFigbWLPc/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-CgU1U6yF1-4/Th6wQNRQN6I/AAAAAAAALKs/HMCvOiNBS2I/s72-c/2011-07-14+11h52_18.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5201357166850736293.post-7901064373718944550</id><published>2011-07-10T23:54:00.000-07:00</published><updated>2011-07-14T03:02:00.134-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><title type='text'>ELMAH - Logging errors in ASP.NET</title><content type='html'>Catching and logging unhandled exceptions is one of the first tasks in developing an ASP.NET application.&lt;br /&gt;&lt;br /&gt;Typically you put code which handles exceptions into Global.asax:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&amp;nbsp;&lt;a href="http://2.bp.blogspot.com/-ipWa6qQZZ5Y/ThqIpbl-bCI/AAAAAAAALJ0/Sq5N2y7lTGI/s1600/2011-07-11+08h21_52.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-ipWa6qQZZ5Y/ThqIpbl-bCI/AAAAAAAALJ0/Sq5N2y7lTGI/s1600/2011-07-11+08h21_52.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;The are many ways to report an error: you may write it into a database, send an email or store it in memory.&amp;nbsp; I got tired of copying such code from one app to another and finally found a component that allows me to handle errors in a code-less way. It is &lt;a href="http://code.google.com/p/elmah/"&gt;ELMAH&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;ELMAH provides an HttpModule which does exactly the same work that I previously used to do.&lt;br /&gt;All I need is to configure its behavior in Web.config.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Installing ELMAH&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The easiest way to install ELMAH is using &lt;a href="http://nuget.codeplex.com/"&gt;NuGet&lt;/a&gt;.&lt;br /&gt;I am not familiar with the command line and always prefer a graphic UI, so I used its this one:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-u9zLfT3dYC8/ThqNKW8w8iI/AAAAAAAALJ4/pc-m_GCJnsw/s1600/2011-07-11+08h41_13.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="393" src="http://3.bp.blogspot.com/-u9zLfT3dYC8/ThqNKW8w8iI/AAAAAAAALJ4/pc-m_GCJnsw/s640/2011-07-11+08h41_13.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Search for ELMAH package:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-VMm0O09zJlo/ThqOWGhSWVI/AAAAAAAALJ8/WjmGTsSEFU4/s1600/2011-07-11+08h45_56.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="360" src="http://1.bp.blogspot.com/-VMm0O09zJlo/ThqOWGhSWVI/AAAAAAAALJ8/WjmGTsSEFU4/s640/2011-07-11+08h45_56.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Select ELMAH, click '&lt;i&gt;Install&lt;/i&gt;' - that's it.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;ELMAH in action&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Any time you have an unhandled exception you see the "yellow screen of death":&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;/b&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-o-0Ay5LQ800/ThqRcNGBBII/AAAAAAAALKA/rfiz1SEf0_Y/s1600/2011-07-11+08h57_12.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="460" src="http://1.bp.blogspot.com/-o-0Ay5LQ800/ThqRcNGBBII/AAAAAAAALKA/rfiz1SEf0_Y/s640/2011-07-11+08h57_12.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;b&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;At the same time the ELMAH module has captured this exception along with all related data and gives you simple web access to the recent errors logged (by default at /elmah.axd)&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-vOyIdtgLSqg/ThqR6uHOEQI/AAAAAAAALKE/CD40r-5an2Y/s1600/2011-07-11+08h57_26.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="212" src="http://2.bp.blogspot.com/-vOyIdtgLSqg/ThqR6uHOEQI/AAAAAAAALKE/CD40r-5an2Y/s640/2011-07-11+08h57_26.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-UZbzsDYtWrk/ThqR8Jy8IfI/AAAAAAAALKI/IXTRxY9vR9Q/s1600/2011-07-11+08h57_59.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="640" src="http://4.bp.blogspot.com/-UZbzsDYtWrk/ThqR8Jy8IfI/AAAAAAAALKI/IXTRxY9vR9Q/s640/2011-07-11+08h57_59.png" width="551" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Configuration&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;By default ELMAH stores logs in memory, but it supports XML and database storages.&lt;br /&gt;Go back to the NuGet package manager and select one of these additional packages: 'ELMA on XML Log', 'ELMA on MS Sql Server Compact', 'ELMAH on MongoDB', etc.&lt;br /&gt;&lt;br /&gt;The selected storage appears in &lt;elmah&gt; sections in Web.config:&lt;/elmah&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-fVFAY5B13iA/ThqWNBl8HKI/AAAAAAAALKM/H8IXaO8Bwfg/s1600/2011-07-11+09h19_52.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-fVFAY5B13iA/ThqWNBl8HKI/AAAAAAAALKM/H8IXaO8Bwfg/s1600/2011-07-11+09h19_52.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;I assume that it is possible to implement a custom logger by deriving the &lt;i&gt;Elmah.ErrorLog &lt;/i&gt;class&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Log an expected exception&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;ELMAH allows to log&lt;b&gt; &lt;/b&gt;any exception from your code.&lt;br /&gt;&lt;br /&gt;For example if you have a code flow which might throw an exception and you gracefully handle it (e.g. with a &lt;i&gt;try/catch&lt;/i&gt; block). Such a swallowed exception will not be propagated and logged by the ELMAH module. For such a case ELMAH provides the &lt;i&gt;ErrorSignal&lt;/i&gt; API:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-jZoiI5uy1eY/ThqZfS4si7I/AAAAAAAALKU/XghdRpApblI/s1600/2011-07-11+09h34_28.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-jZoiI5uy1eY/ThqZfS4si7I/AAAAAAAALKU/XghdRpApblI/s1600/2011-07-11+09h34_28.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;More features&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;ELMAH has a lot more features, which are not part of this short overview. You can:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Filter unwanted exceptions, programmatically and via configuration. &lt;/li&gt;&lt;li&gt;Get a digest RSS feed that lists errors by day and up to last 15 days.&amp;nbsp;&lt;/li&gt;&lt;li&gt;Send error notifications as tweets to Twitter.&lt;/li&gt;&lt;li&gt;Send an e-mail notification of each error at the time it occurs.&amp;nbsp;&lt;/li&gt;&lt;li&gt;and &lt;a href="http://code.google.com/p/elmah/"&gt;more&lt;/a&gt;... &lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5201357166850736293-7901064373718944550?l=igorzelmanovich.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://igorzelmanovich.blogspot.com/feeds/7901064373718944550/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://igorzelmanovich.blogspot.com/2011/07/elmah-logging-errors-in-aspnet.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5201357166850736293/posts/default/7901064373718944550'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5201357166850736293/posts/default/7901064373718944550'/><link rel='alternate' type='text/html' href='http://igorzelmanovich.blogspot.com/2011/07/elmah-logging-errors-in-aspnet.html' title='ELMAH - Logging errors in ASP.NET'/><author><name>Igor Zelmanovich</name><uri>https://profiles.google.com/105271231664740991104</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-vJdYr2PbajQ/AAAAAAAAAAI/AAAAAAAAAAA/1iMFigbWLPc/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-ipWa6qQZZ5Y/ThqIpbl-bCI/AAAAAAAALJ0/Sq5N2y7lTGI/s72-c/2011-07-11+08h21_52.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5201357166850736293.post-818773572402564604</id><published>2011-03-10T03:46:00.000-08:00</published><updated>2011-03-10T03:46:07.732-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Gendarme'/><category scheme='http://www.blogger.com/atom/ns#' term='tools'/><category scheme='http://www.blogger.com/atom/ns#' term='IZWebFileManager'/><category scheme='http://www.blogger.com/atom/ns#' term='Mono'/><title type='text'>Mono's Gendarme</title><content type='html'>&lt;a href="http://www.mono-project.com/Gendarme"&gt;Gendarme&lt;/a&gt; is a extensible rule-based tool to find problems in .NET applications and libraries. Gendarme inspects programs and libraries that contain code in ECMA CIL format (Mono and .NET) and looks for common problems with the code, problems that compiler do not typically check or have not historically checked.&lt;br /&gt;&lt;br /&gt;I ran this tool against my &lt;a href="http://www.izwebfilemanager.com/"&gt;IZWebFileManager&lt;/a&gt;. The result was 1213 potential defects using 254 rules!:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://lh5.googleusercontent.com/-vCrAEZEBJFo/TXi5M8rBUTI/AAAAAAAALG8/CoS5kBbL3GA/s1600/2011-03-10+13h35_01.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="507" src="https://lh5.googleusercontent.com/-vCrAEZEBJFo/TXi5M8rBUTI/AAAAAAAALG8/CoS5kBbL3GA/s640/2011-03-10+13h35_01.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Seems I have a lot of work here.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5201357166850736293-818773572402564604?l=igorzelmanovich.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://igorzelmanovich.blogspot.com/feeds/818773572402564604/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://igorzelmanovich.blogspot.com/2011/03/monos-gendarme.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5201357166850736293/posts/default/818773572402564604'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5201357166850736293/posts/default/818773572402564604'/><link rel='alternate' type='text/html' href='http://igorzelmanovich.blogspot.com/2011/03/monos-gendarme.html' title='Mono&apos;s Gendarme'/><author><name>Igor Zelmanovich</name><uri>https://profiles.google.com/105271231664740991104</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-vJdYr2PbajQ/AAAAAAAAAAI/AAAAAAAAAAA/1iMFigbWLPc/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='https://lh5.googleusercontent.com/-vCrAEZEBJFo/TXi5M8rBUTI/AAAAAAAALG8/CoS5kBbL3GA/s72-c/2011-03-10+13h35_01.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5201357166850736293.post-5303681597482660840</id><published>2011-02-28T22:25:00.000-08:00</published><updated>2011-03-03T01:01:42.943-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='formatting'/><category scheme='http://www.blogger.com/atom/ns#' term='DateTime'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>DateTime formatting in C#</title><content type='html'>I use a custom format to show DateTime to user: "dd/MM/yyyy".&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;var nowString = now.ToString("dd/MM/yyyy");&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The reason, I use the custom formatting, is to be not depended on user regional settings.&lt;br /&gt;&lt;br /&gt;So, no matter what user's locale is, I expect the same format for a date.&lt;br /&gt;&lt;br /&gt;But today I found that it does not work as I expect. On one of the target machines I got "28.02.2011" instead of expected "28/02/2011".&lt;br /&gt;&lt;br /&gt;Why slash (/) is replaced by dot (.)? Is format string not enough explicit?&lt;br /&gt;&lt;br /&gt;I got the answer on MSDN (RTFM!): The slash (/) is not a literal, but a pattern for the default date separator defined in DateTimeFormatInfo.DateSeparator. It has to be escaped (leading with back slash (\)), for being reproduced literally.&lt;br /&gt;&lt;br /&gt;I fix my format string to be @"dd\/MM\/yyyy"&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;var nowString = now.ToString(@"dd\/MM\/yyyy");&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Now it works!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5201357166850736293-5303681597482660840?l=igorzelmanovich.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://igorzelmanovich.blogspot.com/feeds/5303681597482660840/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://igorzelmanovich.blogspot.com/2011/02/datetime-formatting-in-c.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5201357166850736293/posts/default/5303681597482660840'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5201357166850736293/posts/default/5303681597482660840'/><link rel='alternate' type='text/html' href='http://igorzelmanovich.blogspot.com/2011/02/datetime-formatting-in-c.html' title='DateTime formatting in C#'/><author><name>Igor Zelmanovich</name><uri>https://profiles.google.com/105271231664740991104</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-vJdYr2PbajQ/AAAAAAAAAAI/AAAAAAAAAAA/1iMFigbWLPc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5201357166850736293.post-474288994988803901</id><published>2011-02-27T01:30:00.000-08:00</published><updated>2011-07-14T03:02:56.686-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='NHProf'/><category scheme='http://www.blogger.com/atom/ns#' term='NHibernate'/><title type='text'>Profiling NHibernate 3 application with NHProf</title><content type='html'>&lt;a href="http://nhprof.com/"&gt;NHProf &lt;/a&gt;is a great too for profiling a &lt;a href="http://nhforge.org/"&gt;NHibernate&lt;/a&gt; application. It is powerful and easy to use.&lt;br /&gt;&lt;br /&gt;I used it for a long time, but recently I ran into troubles when I tried to capture DB queries  in my newly started web application using NHibernate 3.0.&lt;br /&gt;&lt;br /&gt;As many times before I downloaded latest NHibernate release, created a new web application, added a references to NHibernate.dll and all dependencies, added a reference to  HibernatingRhinos.Profiler.Appender.dll and put a code, initializing NHProf - &lt;span style="font-style: italic;"&gt;HibernatingRhinos.Profiler.Appender.NHibernate.NHibernateProfiler.Initialize(); &lt;/span&gt; in Application_Start.&lt;br /&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;After all that I expected NHPfrof be working smoothly, but all what I got was NHPfor window with no record, but indicating my application is being profiled:&lt;br /&gt;&lt;br /&gt;&lt;a href="https://picasaweb.google.com/lh/photo/JJdcGkNvI4DykWO5XfxK0TgAANDkdsfZKq9zdjvyQwU?feat=embedwebsite"&gt;&lt;img height="480" src="https://lh6.googleusercontent.com/_XoCEelnLy98/TWosUOfz4vI/AAAAAAAALGM/r5pG1fkzfZQ/s640/2011-02-27%2011h51_44.png" width="640" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;It was strange!&lt;br /&gt;&lt;br /&gt;Since it was my first application using NHibernate 3, I though it is a compatibility issue of NHibernate. But then I took one of my previous applications, upgraded it to use NHibernate 3.0  - and this one was profiled perfect.&lt;br /&gt;&lt;br /&gt;I started to look at differences between two applications. Both looked similar, except one detail - all my previous application have reference to &lt;span style="font-weight: bold;"&gt;log4net.dll&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Of course! NHProf use logging interceptions to capture NHibernate logs. It relies on log4net is exists in my application. After I added a reference to log4net.dll (and ensured it's copied to the 'bin' directory), it worked fine.&lt;br /&gt;&lt;br /&gt;The problem had been solved, but I still was interesting, why I did not get such a problem with my previous projects.  The answer was found with &lt;a href="http://www.red-gate.com/products/dotnet-development/reflector/"&gt;reflector&lt;/a&gt; (amazing tool, BTW).&lt;br /&gt;&lt;br /&gt;I figured out that NHibernate 3.0 download does not contain log4net.dll, and  NHibernate.dll does not reference to log4net.dll either:&lt;br /&gt;&lt;br /&gt;&lt;a href="https://picasaweb.google.com/lh/photo/C4ZZ_pUZXrA0tPaE2pm0fDgAANDkdsfZKq9zdjvyQwU?feat=embedwebsite"&gt;&lt;img height="551" src="https://lh4.googleusercontent.com/_XoCEelnLy98/TWopqqWPgkI/AAAAAAAALF8/59MUuM7yfYc/s640/2011-02-27%2012h37_58.png" width="640" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;It allowed me to run my application with no log4net.&lt;br /&gt;&lt;br /&gt;If I used NHibernate 2.x with no log4net.dll , I would get an exception at runtime. That why all my previous application have explicit reference to log4net, and I never got a troubled with NHProf.&lt;br /&gt;&lt;br /&gt;Conclusion: Don't forget to add log4net to your project, if you using NHibernate 3!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5201357166850736293-474288994988803901?l=igorzelmanovich.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://igorzelmanovich.blogspot.com/feeds/474288994988803901/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://igorzelmanovich.blogspot.com/2011/02/profiling-nhibernate-3-application-with.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5201357166850736293/posts/default/474288994988803901'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5201357166850736293/posts/default/474288994988803901'/><link rel='alternate' type='text/html' href='http://igorzelmanovich.blogspot.com/2011/02/profiling-nhibernate-3-application-with.html' title='Profiling NHibernate 3 application with NHProf'/><author><name>Igor Zelmanovich</name><uri>https://profiles.google.com/105271231664740991104</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-vJdYr2PbajQ/AAAAAAAAAAI/AAAAAAAAAAA/1iMFigbWLPc/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='https://lh6.googleusercontent.com/_XoCEelnLy98/TWosUOfz4vI/AAAAAAAALGM/r5pG1fkzfZQ/s72-c/2011-02-27%2011h51_44.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5201357166850736293.post-1578041326211859052</id><published>2011-02-17T03:54:00.000-08:00</published><updated>2011-02-17T05:34:40.765-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WebMatrix'/><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><title type='text'>Microsoft's free tool for PHP development</title><content type='html'>It sounds ironical, but Microsoft really provides a great tool for web development supporting PHP.&lt;br /&gt;&lt;br /&gt;Welcome &lt;a href="http://www.microsoft.com/web/webmatrix/"&gt;WebMatrix&lt;/a&gt;!&lt;br /&gt;&lt;br /&gt;At first look it is yet another tool to support the native Microsoft .NET technology. In fact I don't remember that Microsoft ever supported non their stuff.&lt;br /&gt;&lt;br /&gt;But the world is changing and now WebMatrix is not only tool for .NET developing. With WebMatrix you can write a pure PHP web application! It is amazing! Isn't it?&lt;br /&gt;&lt;br /&gt;In this post will show you how to start a new PHP web application with WebMatrix.&lt;br /&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;When you first time run WebMatrix you get a splash screen with four option of starting using WebMatrix.&lt;br /&gt;&lt;br /&gt;&lt;a href="https://picasaweb.google.com/lh/photo/K9LUodw9IoibL_CZeFwP1TgAANDkdsfZKq9zdjvyQwU?feat=embedwebsite"&gt;&lt;img src="https://lh4.googleusercontent.com/_XoCEelnLy98/TV0WldMZ8bI/AAAAAAAALDo/e40gU9CiHf8/s640/2011-02-17%2012h45_23.png" height="469" width="640" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;As new WebMatrix user I start with "Site from template" which takes me to selection of template.&lt;br /&gt;&lt;br /&gt;&lt;a href="https://picasaweb.google.com/lh/photo/qNoG488qpnDB3pMKsqgdGTgAANDkdsfZKq9zdjvyQwU?feat=embedwebsite"&gt;&lt;img src="https://lh6.googleusercontent.com/_XoCEelnLy98/TV0XD0ZZYII/AAAAAAAALD8/to_iLAlaIC0/s640/2011-02-17%2012h45_51.png" height="469" width="640" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;There you may chose any template from the list, but for keeping this simple I select "Empty Site".&lt;br /&gt;&lt;br /&gt;By clicking "OK" button WebMatrix create the site and now it is a time to take a look at the site settings.&lt;br /&gt;&lt;br /&gt;In the settings you will find "Enable PHP" checkbox. That's the thing!&lt;br /&gt;It not only enables PHP, it lets you select which PHP version you want to use!&lt;br /&gt;&lt;br /&gt;&lt;a href="https://picasaweb.google.com/lh/photo/xMil-wds6GGKmm0sn5WuAjgAANDkdsfZKq9zdjvyQwU?feat=embedwebsite"&gt;&lt;img src="https://lh6.googleusercontent.com/_XoCEelnLy98/TV0XEi4StxI/AAAAAAAALEA/JymAtPZoVN0/s640/2011-02-17%2012h46_43.png" height="469" width="640" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="https://picasaweb.google.com/lh/photo/YEj8kUy-7ldyFdoBTgrzCTgAANDkdsfZKq9zdjvyQwU?feat=embedwebsite"&gt;&lt;img src="https://lh4.googleusercontent.com/_XoCEelnLy98/TV0XElzkTXI/AAAAAAAALEE/rkg0-LN4Sv4/s640/2011-02-17%2012h48_02.png" height="469" width="640" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;After configuring PHP there is a time to start codding.&lt;br /&gt;Switch to to "Files" view and "New" button on the toolbar. It prompts you to select a file type (which is actually file template). In the list of file types pick "PHP" and name it "index.pxp"&lt;br /&gt;&lt;br /&gt;&lt;a href="https://picasaweb.google.com/lh/photo/FNvm9IaKrPvvUQAr-InWBDgAANDkdsfZKq9zdjvyQwU?feat=embedwebsite"&gt;&lt;img src="https://lh5.googleusercontent.com/_XoCEelnLy98/TV0XExfMIoI/AAAAAAAALEI/noj3MkQM5CA/s640/2011-02-17%2012h56_00.png" height="469" width="640" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The new file is opened in the file editor. Lets start coding. I replace existing content with 'classic' phpinfo();. As you may see, they have PHP syntax highlighting there!&lt;br /&gt;&lt;br /&gt;&lt;a href="https://picasaweb.google.com/lh/photo/cpUiBd6Ku4cQ3EI9E_DwbjgAANDkdsfZKq9zdjvyQwU?feat=embedwebsite"&gt;&lt;img src="https://lh4.googleusercontent.com/_XoCEelnLy98/TV0XFBvyAPI/AAAAAAAALEM/cSWzzLcYLq8/s640/2011-02-17%2013h00_08.png" height="469" width="640" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Lets run!&lt;br /&gt;&lt;br /&gt;Switch back to "Site" view. There you may find a URL of web server (IIS 7 express) which hosts this site. Just click the link.&lt;br /&gt;&lt;br /&gt;&lt;a href="https://picasaweb.google.com/lh/photo/9joZu1ySLFqDiqxtveLIaDgAANDkdsfZKq9zdjvyQwU?feat=embedwebsite"&gt;&lt;img src="https://lh6.googleusercontent.com/_XoCEelnLy98/TV0XWG28ikI/AAAAAAAALEU/zyyZR5F2vpE/s640/2011-02-17%2013h00_44.png" height="469" width="640" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="https://picasaweb.google.com/lh/photo/upzakUSIEjm9Lj9ZsSBvkjgAANDkdsfZKq9zdjvyQwU?feat=embedwebsite"&gt;&lt;img src="https://lh5.googleusercontent.com/_XoCEelnLy98/TV0XNJkfKaI/AAAAAAAALEQ/Sq4m7kyXjd4/s640/2011-02-17%2013h01_52.png" height="472" width="640" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;That's the story! Microsoft has a free tool for PHP!&lt;br /&gt;&lt;br /&gt;What do you say?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5201357166850736293-1578041326211859052?l=igorzelmanovich.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://igorzelmanovich.blogspot.com/feeds/1578041326211859052/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://igorzelmanovich.blogspot.com/2011/02/microsofts-free-tool-for-php.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5201357166850736293/posts/default/1578041326211859052'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5201357166850736293/posts/default/1578041326211859052'/><link rel='alternate' type='text/html' href='http://igorzelmanovich.blogspot.com/2011/02/microsofts-free-tool-for-php.html' title='Microsoft&apos;s free tool for PHP development'/><author><name>Igor Zelmanovich</name><uri>https://profiles.google.com/105271231664740991104</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-vJdYr2PbajQ/AAAAAAAAAAI/AAAAAAAAAAA/1iMFigbWLPc/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='https://lh4.googleusercontent.com/_XoCEelnLy98/TV0WldMZ8bI/AAAAAAAALDo/e40gU9CiHf8/s72-c/2011-02-17%2012h45_23.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5201357166850736293.post-6191372766755139443</id><published>2011-02-16T20:48:00.000-08:00</published><updated>2011-02-16T21:48:12.789-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET MVC'/><category scheme='http://www.blogger.com/atom/ns#' term='IIS 7'/><title type='text'>ASP.NET MVC 3 Extensionless URLs on IIS 7 classic mode</title><content type='html'>Prior ASP.NET 4.0, the only way to handle extensionless URLs was setting &lt;span style="font-weight: bold;"&gt;runAllManagedModulesForAllRequests=”true”&lt;/span&gt; (IIS 7 integrated mode) or mapping a wildcard (IIS 6 and IIS 7 in classic mode). That impacts the performance of static requests (HTML, JPG, GIF, CSS, JS, etc), because a all requests are handled by ASP.NET and runs application pipeline with all attached modules.&lt;br /&gt;&lt;br /&gt;ASP.NET v4.0 provides a better way to enable extensionless URLs routing.&lt;br /&gt;There is a new feature that allows extensionless URLs to be directed into managed code, without a wildcard mapping or setting runAllManagedModulesForAllRequests=”true”.&lt;br /&gt;Because of this feature all static resources requests are not longer handled by ASP.NET, and consequentially, they are no longer suffered by performance impact.&lt;br /&gt;&lt;br /&gt;It works by default on IIS 6. You may read more about this feature on IIS 6 &lt;a href="http://haacked.com/archive/2010/12/22/asp-net-mvc-3-extensionless-urls-on-iis-6.aspx"&gt;here&lt;/a&gt; .&lt;br /&gt;&lt;br /&gt;But IIS 7 surprises a lot! It does not support this feature by default, and I spend an hours to find solution.&lt;br /&gt;&lt;br /&gt;The solution is called IIS 7 QFE and steps to download it can be found at &lt;a href="http://support.microsoft.com/kb/980368"&gt;http://support.microsoft.com/kb/980368&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I don't know why they did not supply this with .NET 4 installation, they know it better.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5201357166850736293-6191372766755139443?l=igorzelmanovich.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://igorzelmanovich.blogspot.com/feeds/6191372766755139443/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://igorzelmanovich.blogspot.com/2011/02/aspnet-mvc-3-extensionless-urls-on-iis.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5201357166850736293/posts/default/6191372766755139443'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5201357166850736293/posts/default/6191372766755139443'/><link rel='alternate' type='text/html' href='http://igorzelmanovich.blogspot.com/2011/02/aspnet-mvc-3-extensionless-urls-on-iis.html' title='ASP.NET MVC 3 Extensionless URLs on IIS 7 classic mode'/><author><name>Igor Zelmanovich</name><uri>https://profiles.google.com/105271231664740991104</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-vJdYr2PbajQ/AAAAAAAAAAI/AAAAAAAAAAA/1iMFigbWLPc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5201357166850736293.post-8969058996220201167</id><published>2010-11-22T08:03:00.000-08:00</published><updated>2011-02-16T20:50:46.282-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IIS 7'/><category scheme='http://www.blogger.com/atom/ns#' term='IronPython'/><category scheme='http://www.blogger.com/atom/ns#' term='CGI'/><title type='text'>Configuring IronPython CGI on IIS 7</title><content type='html'>This guide walks you through configuring IronPython CGI on IIS 7.&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Install IronPython&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;First you need to download and install IronPython at &lt;a href="http://ironpython.codeplex.com/"&gt;http://ironpython.codeplex.com/&lt;/a&gt;.&lt;br /&gt;This post uses IronPython 2.7 Beta 1. By default, installer put the files in C:\Program Files (x86)\IronPython 2.7. The installation path might be changed during installation process.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Install CGI support in IIS&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;By default CGI support is not installed. To turn it on, open &lt;span style="font-style: italic; font-weight: bold;"&gt;Control Panel &gt; Programs and Features  &gt; Turn Windows features on and off&lt;/span&gt;&lt;span style="font-weight: bold;"&gt; dialog&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Select &lt;span style="font-weight: bold;"&gt;Internet Information Services &gt; World Wide Web Services &gt; Application Development Features &gt; CGI module&lt;/span&gt; and click &lt;span style="font-weight: bold; font-style: italic;"&gt;OK&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://lh6.ggpht.com/_XoCEelnLy98/TOmEXOFU95I/AAAAAAAAKxU/ShlLX9fT_f0/s800/2010-11-20%2009h41_38.png" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;&lt;br /&gt;Configure Handle Mapping&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Open  &lt;span style="font-style: italic; font-weight: bold;"&gt;Control Pane &gt; &lt;/span&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt;Administrative Tools&lt;/span&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt; &gt; Internet Information Services (IIS) Manager&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;In the &lt;span style="font-style: italic; font-weight: bold;"&gt;Features View&lt;/span&gt;, open &lt;span style="font-style: italic; font-weight: bold;"&gt;Handler Mappings&lt;/span&gt;, right click to &lt;span style="font-style: italic; font-weight: bold;"&gt;Add Script Map ...&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;In &lt;span style="font-weight: bold; font-style: italic;"&gt;Request &lt;/span&gt;path, put "*.py" as the script files extension, In &lt;span style="font-weight: bold; font-style: italic;"&gt;Executable &lt;/span&gt;select "C:\Program Files (x86)\IronPython 2.7\ipy.exe" %s%s - the IronPython installation path and it's parameters.&lt;br /&gt;&lt;br /&gt;I actually don't know what such "%s%s" parameters mean, but believe me, you need to keep it as is.  It doesn't work without.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://lh3.ggpht.com/_XoCEelnLy98/TOmEXRpwZRI/AAAAAAAAKxY/wfHbBToWyAQ/s800/2010-11-21%2022h27_03.png" /&gt;&lt;br /&gt;&lt;br /&gt;Click &lt;span style="font-weight: bold; font-style: italic;"&gt;OK&lt;/span&gt;, then you will be prompt to allow this CGI extension - click &lt;span style="font-weight: bold; font-style: italic;"&gt;OK&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://lh6.ggpht.com/_XoCEelnLy98/TOmEXZWDcVI/AAAAAAAAKxc/RO_HMrDlWrw/s800/2010-11-21%2022h27_49.png" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Run Python script&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Write a simple Python script and place it in the root folder of the  web site.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://lh6.ggpht.com/_XoCEelnLy98/TOmEXjTS1uI/AAAAAAAAKxg/_NmARkU6cEc/s800/2010-11-21%2022h28_44.png" /&gt;&lt;br /&gt;&lt;br /&gt;Point your browser to the test script and it should be working.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://lh3.ggpht.com/_XoCEelnLy98/TOmEXv0zypI/AAAAAAAAKxk/VmHEVvjkBXo/s800/2010-11-21%2022h29_58.png" /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5201357166850736293-8969058996220201167?l=igorzelmanovich.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://igorzelmanovich.blogspot.com/feeds/8969058996220201167/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://igorzelmanovich.blogspot.com/2010/11/configuring-ironpython-cgi-on-iis-7.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5201357166850736293/posts/default/8969058996220201167'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5201357166850736293/posts/default/8969058996220201167'/><link rel='alternate' type='text/html' href='http://igorzelmanovich.blogspot.com/2010/11/configuring-ironpython-cgi-on-iis-7.html' title='Configuring IronPython CGI on IIS 7'/><author><name>Igor Zelmanovich</name><uri>https://profiles.google.com/105271231664740991104</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-vJdYr2PbajQ/AAAAAAAAAAI/AAAAAAAAAAA/1iMFigbWLPc/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_XoCEelnLy98/TOmEXOFU95I/AAAAAAAAKxU/ShlLX9fT_f0/s72-c/2010-11-20%2009h41_38.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5201357166850736293.post-3343063027732918805</id><published>2010-11-21T00:20:00.001-08:00</published><updated>2010-11-21T03:11:49.609-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='IronPython'/><title type='text'>Write custom ASP.NET HTTP Handler with IronPython</title><content type='html'>An HTTP handler is the endpoint that responds to handle request made by an ASP.NET Web application. The request is mapped to HTTP handler based on name pattern (commonly file extension). ASP.NET provides a few default HTTP handlers: Page handler (.aspx), Web Service handler (.asmx), Generic handler (.ashx) and so forth.&lt;br /&gt;&lt;br /&gt;ASHX Generic handler is special since it allows to implement IHttpHandler API immediately.&lt;br /&gt;There is a sample - HelloWorld.ashx:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://lh3.ggpht.com/_XoCEelnLy98/TOjlq4eb6_I/AAAAAAAAKwo/SvvlJ_vIhXw/s800/2010-11-21%2011h18_24.png" /&gt;&lt;br /&gt;&lt;br /&gt;Language attribute allows me to chose program language to use, but it strongly limited by only two - C# and VB. What if I want to write my code in Python?&lt;br /&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;.NET actually provides support for Python language with IronPython.  And I assume that it is possible to write such a handle using IronPython. But How?&lt;br /&gt;&lt;br /&gt;.ashx  is  mapped to System.Web.UI.SimpleHandlerFactory. When .ashx file is requested, this handler parses .ashx file into .NET class and compiles it using either C# or VB compiler (accordingly to language attribute). Using another language requires to setup suitable compiler for this language, handle parsing and so on. I am not sure I want to work so hard for that.&lt;br /&gt;&lt;br /&gt;So I chose an alternative way. I will create my own handler, which will process a python code.&lt;br /&gt;&lt;br /&gt;At first I chose a file extension to be mapped - .pyhx.&lt;br /&gt;I want .pyhx be pure python code but looks similar to .ashx. Each file will define a class implements IHttpHandler. The name of the class have to be the same as the file name.&lt;br /&gt;There is a sample - HelloWorld.pyhx:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://lh3.ggpht.com/_XoCEelnLy98/TOjmyjhkPyI/AAAAAAAAKw8/SoNlG0yZRS8/s800/2010-11-21%2011h16_23.png" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The next step is implementing IHttpHandlerFactory, to which .pyhx will be mapped.&lt;br /&gt;Such factory creates instances of IHttpHandler defined in .pyhx (pure Python code). It works similar to SimpleHandlerFactory, but instead of parsing and compiling the file, it executes the python code  using advantage of DLR hosting API.&lt;br /&gt;&lt;br /&gt;There is C# implementation:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://lh6.ggpht.com/_XoCEelnLy98/TOjmywFaScI/AAAAAAAAKxA/o-biZijULYw/s800/2010-11-21%2011h21_28.png" /&gt;&lt;br /&gt;&lt;br /&gt;The only thing is left is to declare .pyhx mapping in Web.config:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://lh6.ggpht.com/_XoCEelnLy98/TOjmy9ke2jI/AAAAAAAAKxE/wzq8sDknnt8/s800/2010-11-21%2011h23_51.png" /&gt;&lt;br /&gt;&lt;br /&gt;That's it! You can write your custom HTTP handler in Python as well as in C# and VB!&lt;br /&gt;&lt;br /&gt;The sample project may be found on GitHub: &lt;a href="https://github.com/manishma/IronPythonAspNetSamples"&gt;https://github.com/manishma/IronPythonAspNetSamples&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5201357166850736293-3343063027732918805?l=igorzelmanovich.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://igorzelmanovich.blogspot.com/feeds/3343063027732918805/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://igorzelmanovich.blogspot.com/2010/11/write-custom-aspnet-http-handler-with.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5201357166850736293/posts/default/3343063027732918805'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5201357166850736293/posts/default/3343063027732918805'/><link rel='alternate' type='text/html' href='http://igorzelmanovich.blogspot.com/2010/11/write-custom-aspnet-http-handler-with.html' title='Write custom ASP.NET HTTP Handler with IronPython'/><author><name>Igor Zelmanovich</name><uri>https://profiles.google.com/105271231664740991104</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-vJdYr2PbajQ/AAAAAAAAAAI/AAAAAAAAAAA/1iMFigbWLPc/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_XoCEelnLy98/TOjlq4eb6_I/AAAAAAAAKwo/SvvlJ_vIhXw/s72-c/2010-11-21%2011h18_24.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5201357166850736293.post-9171088539931687531</id><published>2010-11-19T01:02:00.000-08:00</published><updated>2010-11-19T01:17:07.970-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET MVC'/><category scheme='http://www.blogger.com/atom/ns#' term='IronPython'/><title type='text'>Write ASP.NET MVC using IronPython - Resources</title><content type='html'>I started research of using IronPython on ASP.NET MVC.&lt;br /&gt;&lt;br /&gt;There are resources I found helpful:&lt;br /&gt;&lt;br /&gt;Official Site: &lt;a href="http://ironpython.net/"&gt;http://ironpython.net/&lt;/a&gt; (download links are not up to date)&lt;br /&gt;Downloads: &lt;a href="http://ironpython.codeplex.com/"&gt;http://ironpython.codeplex.com/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;ASP.NET Dynamic Language Support: &lt;a href="http://aspnet.codeplex.com/wikipage?title=Dynamic%20Language%20Support&amp;amp;referringTitle=Home&amp;amp;ProjectName=aspnet"&gt;http://aspnet.codeplex.com/wikipage?title=Dynamic%20Language%20Support&amp;amp;referringTitle=Home&amp;amp;ProjectName=aspnet&lt;/a&gt;&lt;br /&gt;IronPython integration with ASP.NET, No support for ASP.NET MVC (at least for now, seems they did support ASP.NET MVC in the past)&lt;br /&gt;&lt;br /&gt;The New Dynamic Language Extensibility Model for ASP.NET: &lt;a href="http://www.asp.net/dynamiclanguages/whitepaper"&gt;http://www.asp.net/dynamiclanguages/whitepaper&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Write ASP.NET MVC application in Ruby: &lt;a href="https://github.com/jschementi/ironrubymvc"&gt;https://github.com/jschementi/ironrubymvc&lt;/a&gt; (not Python, but similar to my target)&lt;br /&gt;&lt;br /&gt;Using IronPython in ASP.NET MVC:&lt;a href="http://www.codevoyeur.com/Articles/Tags/ironpython.aspx"&gt; http://www.codevoyeur.com/Articles/Tags/ironpython.aspx&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.codevoyeur.com/Articles/12/A-Simple-IronPython-ControllerFactory-for-ASP.NET-MVC.aspx"&gt;A Simple IronPython ControllerFactory for ASP.NET MVC&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.codevoyeur.com/Articles/16/A-Simple-IronPython-ActionFilter-for-ASP.NET-MVC.aspx"&gt;A Simple IronPython ActionFilter for ASP.NET MVC&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.codevoyeur.com/Articles/21/A-Simple-IronPython-Route-Mapper-for-ASP.NET-MVC.aspx"&gt;A Simple IronPython Route Mapper for ASP.NET MVC&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.codevoyeur.com/Articles/23/An-Unobtrusive-IronPython-ViewEngine-for-ASP.NET-MVC.aspx"&gt;An Unobtrusive IronPython ViewEngine for ASP.NET MVC&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The last links seem to be worthiest&lt;br /&gt;&lt;br /&gt;The next step  is starting simple ASP.NET MVC application with IronPython.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5201357166850736293-9171088539931687531?l=igorzelmanovich.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://igorzelmanovich.blogspot.com/feeds/9171088539931687531/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://igorzelmanovich.blogspot.com/2010/11/write-aspnet-mvc-using-ironpython.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5201357166850736293/posts/default/9171088539931687531'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5201357166850736293/posts/default/9171088539931687531'/><link rel='alternate' type='text/html' href='http://igorzelmanovich.blogspot.com/2010/11/write-aspnet-mvc-using-ironpython.html' title='Write ASP.NET MVC using IronPython - Resources'/><author><name>Igor Zelmanovich</name><uri>https://profiles.google.com/105271231664740991104</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-vJdYr2PbajQ/AAAAAAAAAAI/AAAAAAAAAAA/1iMFigbWLPc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5201357166850736293.post-7401742529680778572</id><published>2010-10-22T04:38:00.000-07:00</published><updated>2010-10-22T05:10:09.380-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IZWebFileManager'/><title type='text'>IZWebFileManager 2.6.2 release is out</title><content type='html'>Hi there!&lt;br /&gt;&lt;br /&gt;I released IZWebFileManager 2.6.2 which has two new features:&lt;br /&gt;&lt;br /&gt;1. Now is goes with &lt;span style="font-weight: bold;"&gt;French translation&lt;/span&gt; - thanks a lot to Cédric Mousset who did it.&lt;br /&gt;&lt;br /&gt;2. New property &lt;span style="font-weight: bold;"&gt;EnableContextMenu&lt;/span&gt;. I was asked about this at forum: &lt;a href="http://www.izwebfilemanager.com/forums/thread/591.aspx"&gt;http://www.izwebfilemanager.com/forums/thread/591.aspx&lt;/a&gt;&lt;br /&gt;You may disable context menu in the file list by setting this property false (it is true by default)&lt;br /&gt;Disabling the context menu will not automatically prevent an actions (such delete file or create new folder). It affects UI only. If you need to disable/cancel an action you have to handle proper event (for example SelectedItemsAction of NewFolderCreating) and cancel the action by setting Cancel=true of event argument.&lt;br /&gt;&lt;br /&gt;The release is available for download from Google Code&lt;br /&gt;&lt;a href="https://code.google.com/p/izwebfilemanager/"&gt;https://code.google.com/p/izwebfilemanager/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5201357166850736293-7401742529680778572?l=igorzelmanovich.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://igorzelmanovich.blogspot.com/feeds/7401742529680778572/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://igorzelmanovich.blogspot.com/2010/10/izwebfilemanager-262-release-is-out.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5201357166850736293/posts/default/7401742529680778572'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5201357166850736293/posts/default/7401742529680778572'/><link rel='alternate' type='text/html' href='http://igorzelmanovich.blogspot.com/2010/10/izwebfilemanager-262-release-is-out.html' title='IZWebFileManager 2.6.2 release is out'/><author><name>Igor Zelmanovich</name><uri>https://profiles.google.com/105271231664740991104</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-vJdYr2PbajQ/AAAAAAAAAAI/AAAAAAAAAAA/1iMFigbWLPc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5201357166850736293.post-2111934837497473291</id><published>2010-08-08T08:45:00.000-07:00</published><updated>2010-08-08T08:56:47.010-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IZWebFileManager'/><title type='text'>IZWebFileManager 2.6.1 release is out</title><content type='html'>I am very happy to announce that IZWebFileManager 2.6.1 has been released.&lt;br /&gt;&lt;br /&gt;The main feature of this release is support of applications running in "Medium Trust" environment.&lt;br /&gt;&lt;br /&gt;I added following &lt;span style="font-weight: bold;"&gt;&amp;lt;trust level="Medium"&amp;gt;&amp;lt;/trust&amp;gt;&lt;/span&gt; directive in Demo's web.config to enforce security restrictions when you run it.&lt;br /&gt;&lt;br /&gt;The release is available for download from Google Code&lt;br /&gt;&lt;a href="https://code.google.com/p/izwebfilemanager/"&gt;https://code.google.com/p/izwebfilemanager/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5201357166850736293-2111934837497473291?l=igorzelmanovich.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://igorzelmanovich.blogspot.com/feeds/2111934837497473291/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://igorzelmanovich.blogspot.com/2010/08/izwebfilemanager-261-release-is-out.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5201357166850736293/posts/default/2111934837497473291'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5201357166850736293/posts/default/2111934837497473291'/><link rel='alternate' type='text/html' href='http://igorzelmanovich.blogspot.com/2010/08/izwebfilemanager-261-release-is-out.html' title='IZWebFileManager 2.6.1 release is out'/><author><name>Igor Zelmanovich</name><uri>https://profiles.google.com/105271231664740991104</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-vJdYr2PbajQ/AAAAAAAAAAI/AAAAAAAAAAA/1iMFigbWLPc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5201357166850736293.post-3217916624377282951</id><published>2010-08-04T00:04:00.000-07:00</published><updated>2010-08-04T01:19:53.842-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MySql'/><category scheme='http://www.blogger.com/atom/ns#' term='ODBC'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP'/><category scheme='http://www.blogger.com/atom/ns#' term='64-bit Windows 7'/><title type='text'>Running ASP+MySql on 64-bit Windows 7</title><content type='html'>I have a legacy ASP 3.0 application working with MySql 4 database via MySql ODBC 3.51 connector.&lt;br /&gt;Currently it runs on Windows 2003 server (32-bit, IIS 6.0). Everything works fine.&lt;br /&gt;&lt;br /&gt;Recently I was asked to make some changes in the application and I had to setup developing environment. Last time I did such setup it was 32-bit Windows XP and I had no problem. But time went by and today I am working with 64-bit Windows 7.&lt;br /&gt;&lt;br /&gt;I started as usual by installing &lt;a href="http://dev.mysql.com/downloads/connector/odbc/3.51.html"&gt;MySql ODBC 3.51  connector&lt;/a&gt;. Install ran smoothly and my next step was to configure proper data source in "ODBC Data Source Administrator" dialog box (Control Panel &gt; Administrative Tools &gt; Data Sources (ODBC)). But to my surprise opened dialog did not list MySql ODBC driver, so I was not able to configure it. Reinstalling the driver did not bring success. What's wrong I did?!?!&lt;br /&gt;&lt;br /&gt;After searching internet (thanks Google) I found solution: "&lt;a href="http://msdn.microsoft.com/en-us/library/ms712362%28VS.85%29.aspx"&gt;To manage a data source that connects to a 32-bit driver under 64-bit platform, use c:\windows\sysWOW64\odbcad32.exe. To manage a data source that connects to a 64-bit driver, use c:\windows\system32\odbcad32.exe.&lt;/a&gt;" Can you imagine that?&lt;br /&gt;&lt;br /&gt;I ran&lt;span style="font-weight: bold;"&gt; c:\windows\sysWOW64\odbcad32.exe&lt;/span&gt; and got the same "ODBC Data Source Administrator" dialog box but now with ability to configure my data source.&lt;br /&gt;&lt;br /&gt;Next step was to set up IIS 7.0 to run ASP 3.0 application. It was relatively easy so I will omit the details.&lt;br /&gt;&lt;br /&gt;At this step I was pretty sure that my application will run properly, but the first request returns error: "&lt;span style="font-weight: bold;"&gt;The specified DSN contains an architecture mismatch between the Driver and Application&lt;/span&gt;". The same question - What's wrong I did?!?!&lt;br /&gt;&lt;br /&gt;Searching again (What would we do without Google?) . Luckily I am not only one who has such a problem. The solution is to &lt;span style="font-weight: bold;"&gt;configure web application to run in a 32-bit application pool&lt;/span&gt;. There is no direct way to run a 32-bit in-process components from a 64-bit application pool.&lt;br /&gt;&lt;br /&gt;Now I got my application runs!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5201357166850736293-3217916624377282951?l=igorzelmanovich.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://igorzelmanovich.blogspot.com/feeds/3217916624377282951/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://igorzelmanovich.blogspot.com/2010/08/running-aspmysql-on-64-bit-windows-7.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5201357166850736293/posts/default/3217916624377282951'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5201357166850736293/posts/default/3217916624377282951'/><link rel='alternate' type='text/html' href='http://igorzelmanovich.blogspot.com/2010/08/running-aspmysql-on-64-bit-windows-7.html' title='Running ASP+MySql on 64-bit Windows 7'/><author><name>Igor Zelmanovich</name><uri>https://profiles.google.com/105271231664740991104</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-vJdYr2PbajQ/AAAAAAAAAAI/AAAAAAAAAAA/1iMFigbWLPc/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5201357166850736293.post-6544578887052002112</id><published>2010-07-29T07:22:00.000-07:00</published><updated>2010-07-29T08:36:03.438-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IZWebFileManager'/><title type='text'>IZWebFileManager 2.6 release is out</title><content type='html'>Welcome the new generation of  IZWebFileManager - v2.6&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;What's new?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;1. Multiple files upload.&lt;/span&gt;&lt;br /&gt;File upload bar allows you to select more then one file to upload at once.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://picasaweb.google.com/lh/photo/1zUhv5WozayoxLijLsgGgDgAANDkdsfZKq9zdjvyQwU?feat=embedwebsite"&gt;&lt;img src="http://lh5.ggpht.com/_XoCEelnLy98/TFGS2NdjGzI/AAAAAAAAKfs/TOmNuUsfwT8/s800/filemanager_multi_upload.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I added two new resource keys to support localization:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Upload_Another_File&lt;/span&gt; - default value "Upload Another File", text of the link bellow the browse file box.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Upload_File_Remove&lt;/span&gt; - default value "Remove", text of the link near to each of browse file boxes.&lt;br /&gt;&lt;br /&gt;To enable localization of this texts just add a proper resources to WebFileManagerResource.XXX.resx suitable you locale.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;2. Upgraded to &lt;/span&gt;&lt;span style="font-weight: bold;"&gt;VS 2010/&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;.NET 3.5.&lt;/span&gt;&lt;br /&gt;Since this release using of IZWebFileManager  requires .NET 3.5 or higher.&lt;br /&gt;&lt;br /&gt;The release is available for download from Google Code&lt;br /&gt;&lt;a href="https://code.google.com/p/izwebfilemanager/"&gt;https://code.google.com/p/izwebfilemanager/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;What's next?&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;In current implementation I use reflection to access some not public API. That causes&lt;span style="font-weight: bold;"&gt; &lt;/span&gt;application fail when run in Medium trust environment. (&lt;a href="http://www.izwebfilemanager.com/forums/thread/543.aspx"&gt;http://www.izwebfilemanager.com/forums/thread/543.aspx&lt;/a&gt;)&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;So, in the next release I will solve this problem.&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;br /&gt;Thanks for support!&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5201357166850736293-6544578887052002112?l=igorzelmanovich.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://igorzelmanovich.blogspot.com/feeds/6544578887052002112/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://igorzelmanovich.blogspot.com/2010/07/izwebfilemanager-26-release-is-out.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5201357166850736293/posts/default/6544578887052002112'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5201357166850736293/posts/default/6544578887052002112'/><link rel='alternate' type='text/html' href='http://igorzelmanovich.blogspot.com/2010/07/izwebfilemanager-26-release-is-out.html' title='IZWebFileManager 2.6 release is out'/><author><name>Igor Zelmanovich</name><uri>https://profiles.google.com/105271231664740991104</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-vJdYr2PbajQ/AAAAAAAAAAI/AAAAAAAAAAA/1iMFigbWLPc/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_XoCEelnLy98/TFGS2NdjGzI/AAAAAAAAKfs/TOmNuUsfwT8/s72-c/filemanager_multi_upload.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5201357166850736293.post-7828776776390317969</id><published>2010-07-22T07:03:00.000-07:00</published><updated>2010-07-22T07:58:34.661-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><title type='text'>HtmlTextWriter fluent interface</title><content type='html'>When working on new features in IZWebFileManager I needed to change rendered HTML.&lt;br /&gt;&lt;br /&gt;I took a look at the code I wrote more then 3 years ago.... It is so complicated!&lt;br /&gt;&lt;br /&gt;IZWebFileManager is a typical custom control that overrides Render and uses HtmlTextWriter's API to produce  HTML.  Here is a small part of the rendering flow:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://picasaweb.google.com/lh/photo/zBk6FKvOANeJzPxvCEDGyzgAANDkdsfZKq9zdjvyQwU?feat=embedwebsite"&gt;&lt;img src="http://lh4.ggpht.com/_XoCEelnLy98/TEhVOVJK9aI/AAAAAAAAKfA/uLXVD3lwCd8/s800/html_render_before.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;It took me a while to figure out what is HTML is rendered here.&lt;br /&gt;The fact is, that HtmlTextWriter's API is not intuitive and requires a lot of effort to produce relatively  simple HTML.  Is there a alternative way to render output?&lt;br /&gt;&lt;br /&gt;WhenLINQ has been released all the .NET world has met fluent APIs, and I was wandering if there is such an API for rendering ASP.NET controls.&lt;br /&gt;&lt;br /&gt;I found this one: &lt;a href="http://csharpfeeds.com/post/9989/HtmlTextWriter_fluent_interface.aspx"&gt;http://csharpfeeds.com/post/9989/HtmlTextWriter_fluent_interface.aspx&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I've just added it to my project (made it internal to prevent collisions), changed it a bit and rewrote the code above:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://picasaweb.google.com/lh/photo/Ib1WHV4CpNuZ6K3c9NoJZDgAANDkdsfZKq9zdjvyQwU?feat=embedwebsite"&gt;&lt;img src="http://lh6.ggpht.com/_XoCEelnLy98/TEhVlx8uMKI/AAAAAAAAKfI/zSB5UKVWvV8/s800/html_render_after.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Now it is much easier to change the rendered HTML, because this code flow is much closer to the HTML markup flow, than when it was written using the "classic" HtmlTextWriter API.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5201357166850736293-7828776776390317969?l=igorzelmanovich.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://igorzelmanovich.blogspot.com/feeds/7828776776390317969/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://igorzelmanovich.blogspot.com/2010/07/htmltextwriter-fluent-interface.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5201357166850736293/posts/default/7828776776390317969'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5201357166850736293/posts/default/7828776776390317969'/><link rel='alternate' type='text/html' href='http://igorzelmanovich.blogspot.com/2010/07/htmltextwriter-fluent-interface.html' title='HtmlTextWriter fluent interface'/><author><name>Igor Zelmanovich</name><uri>https://profiles.google.com/105271231664740991104</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-vJdYr2PbajQ/AAAAAAAAAAI/AAAAAAAAAAA/1iMFigbWLPc/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_XoCEelnLy98/TEhVOVJK9aI/AAAAAAAAKfA/uLXVD3lwCd8/s72-c/html_render_before.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5201357166850736293.post-583234032794779597</id><published>2010-06-30T12:28:00.000-07:00</published><updated>2010-06-30T12:40:01.105-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IZWebFileManager'/><title type='text'>IZWebFileManager 2.5.4 release is out</title><content type='html'>I am very happy to announce that IZWebFileManager 2.5.4 has been released.&lt;br /&gt;&lt;br /&gt;From now (and forever) it supports Chrome, Safari and Opera browsers.&lt;br /&gt;You are welcome to try it using online demo:&lt;br /&gt; &lt;a href="http://www.izwebfilemanager.com/demo/default.aspx"&gt;http://www.izwebfilemanager.com/demo/default.aspx&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The release is available for download from Google Code&lt;br /&gt;&lt;a href="https://code.google.com/p/izwebfilemanager/"&gt;https://code.google.com/p/izwebfilemanager/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Cheers!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5201357166850736293-583234032794779597?l=igorzelmanovich.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://igorzelmanovich.blogspot.com/feeds/583234032794779597/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://igorzelmanovich.blogspot.com/2010/06/izwebfilemanager-254-release-is-out.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5201357166850736293/posts/default/583234032794779597'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5201357166850736293/posts/default/583234032794779597'/><link rel='alternate' type='text/html' href='http://igorzelmanovich.blogspot.com/2010/06/izwebfilemanager-254-release-is-out.html' title='IZWebFileManager 2.5.4 release is out'/><author><name>Igor Zelmanovich</name><uri>https://profiles.google.com/105271231664740991104</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-vJdYr2PbajQ/AAAAAAAAAAI/AAAAAAAAAAA/1iMFigbWLPc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5201357166850736293.post-3291941414539055182</id><published>2010-06-02T08:19:00.000-07:00</published><updated>2010-06-02T09:42:19.199-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MSBuild'/><category scheme='http://www.blogger.com/atom/ns#' term='NAnt'/><title type='text'>Build .NET Project with NAnt</title><content type='html'>Since &lt;a href="http://nant.sourceforge.net/"&gt;NAnt&lt;/a&gt; comes with &lt;a href="http://sourceforge.net/projects/nant/files/nant/0.90/"&gt;NAnt 0.90&lt;/a&gt; release I was interested to use it with my project &lt;a href="http://www.izwebfilemanager.com/default.aspx"&gt;IZWebFileManage.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;At first look it is powerful tool allows me easy to build project, run tests and package release.&lt;br /&gt;&lt;br /&gt;The first task was"build" of course.&lt;br /&gt;&lt;br /&gt;For such purpose NAnt offers &lt;span style="font-weight: bold; font-style: italic;"&gt;&amp;lt;csc&amp;gt;&lt;/span&gt; &lt;span style="font-style: italic; font-weight: bold;"&gt;&lt;csc&gt;&lt;/csc&gt;&lt;/span&gt; task, but using this task I have to declare output type, list of source files, resources etc. It is quite good if you are using Notepad or any other (not Visual Studio) IDE, but I (and I believe most of .NET developers)  use Visual Studio and have *.csproj file.&lt;br /&gt;&lt;br /&gt;Is there a way to build VS project with NAnt? Yes, you may find it in &lt;a href="http://nantcontrib.sourceforge.net/"&gt;NAntContrib&lt;/a&gt;. It provides &lt;span style="font-weight: bold; font-style: italic;"&gt;&amp;lt;msbuild&amp;gt;&lt;/span&gt; &lt;span style="font-style: italic; font-weight: bold;"&gt;&lt;msbuild&gt;&lt;/msbuild&gt;&lt;/span&gt; task. But problem is that NAntContrib is quite out of date.  The last release is on 2006/10/15 and I am not sure it supports NAnt 0.90 and VS 2008&lt;br /&gt;&lt;br /&gt;Is there alternative way to build *.csproj? Yes - msbuild command line!&lt;br /&gt;NAnt has &lt;span style="font-weight: bold; font-style: italic;"&gt;&amp;lt;exec&amp;gt;&lt;/span&gt; &lt;span style="font-weight: bold; font-style: italic;"&gt;&lt;exec&gt;&lt;/exec&gt;&lt;/span&gt; task which run any command line you want.&lt;br /&gt;&lt;br /&gt;There is my Default.build file:&lt;br /&gt;&lt;br /&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;?&lt;/span&gt;&lt;span class="html"&gt;xml&lt;/span&gt; &lt;span class="attr"&gt;version&lt;/span&gt;&lt;span class="kwrd"&gt;="1.0"&lt;/span&gt; ?&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;project&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;="IZWebFileManager"&lt;/span&gt; &lt;span class="attr"&gt;default&lt;/span&gt;&lt;span class="kwrd"&gt;="build"&lt;/span&gt; &lt;span class="attr"&gt;&lt;br /&gt;        xmlns&lt;/span&gt;&lt;span class="kwrd"&gt;="http://nant.sf.net/schemas/nant.xsd"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt; &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;property&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;="project.config"&lt;/span&gt; &lt;span class="attr"&gt;value&lt;/span&gt;&lt;span class="kwrd"&gt;="Debug"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt; &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;target&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;="clean"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;     &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;exec&lt;/span&gt; &lt;span class="attr"&gt;program&lt;/span&gt;&lt;span class="kwrd"&gt;="${framework::get-framework-directory(framework::get-target-framework())}\msbuild.exe"&lt;/span&gt;&lt;br /&gt;               &lt;span class="attr"&gt;commandline&lt;/span&gt;&lt;span class="kwrd"&gt;='/t:Clean /p:Configuration=${project.config} /p:Platform="AnyCPU" /v:n'&lt;/span&gt;&lt;br /&gt;                 &lt;span class="attr"&gt;workingdir&lt;/span&gt;&lt;span class="kwrd"&gt;="."&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt; &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;target&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt; &lt;br /&gt; &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;target&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;="version"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt; &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;target&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt; &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;target&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;="build"&lt;/span&gt; &lt;span class="attr"&gt;depends&lt;/span&gt;&lt;span class="kwrd"&gt;="clean, version"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;     &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;exec&lt;/span&gt; &lt;span class="attr"&gt;program&lt;/span&gt;&lt;span class="kwrd"&gt;="${framework::get-framework-directory(framework::get-target-framework())}\msbuild.exe"&lt;/span&gt;&lt;br /&gt;               &lt;span class="attr"&gt;commandline&lt;/span&gt;&lt;span class="kwrd"&gt;='/t:Build /p:Configuration=${project.config} /p:Platform="AnyCPU" /v:n'&lt;/span&gt;&lt;br /&gt;                 &lt;span class="attr"&gt;workingdir&lt;/span&gt;&lt;span class="kwrd"&gt;="."&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt; &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;target&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;project&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;I place Default.build file near to *.csproj file and msbuild find it by default, so there is no need to mention name of project file explicitly.&lt;br /&gt;&lt;br /&gt;Run build using command line:&lt;br /&gt;&lt;br /&gt;&gt;nant build&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;P.S. After a while I figured out &lt;span style="font-weight: bold; font-style: italic;"&gt;&amp;lt;solution&lt;/span&gt;&lt;span style="font-style: italic;"&gt;&lt;span style="font-weight: bold;"&gt;&amp;gt; &lt;/span&gt;&lt;/span&gt;task. Looks like that is what I need to run msbuild with NAnt. I will discover it...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5201357166850736293-3291941414539055182?l=igorzelmanovich.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://igorzelmanovich.blogspot.com/feeds/3291941414539055182/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://igorzelmanovich.blogspot.com/2010/06/build-net-project-with-nant.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5201357166850736293/posts/default/3291941414539055182'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5201357166850736293/posts/default/3291941414539055182'/><link rel='alternate' type='text/html' href='http://igorzelmanovich.blogspot.com/2010/06/build-net-project-with-nant.html' title='Build .NET Project with NAnt'/><author><name>Igor Zelmanovich</name><uri>https://profiles.google.com/105271231664740991104</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-vJdYr2PbajQ/AAAAAAAAAAI/AAAAAAAAAAA/1iMFigbWLPc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5201357166850736293.post-323380471788156339</id><published>2010-05-17T06:07:00.001-07:00</published><updated>2010-05-17T07:25:14.395-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET MVC'/><category scheme='http://www.blogger.com/atom/ns#' term='jQuery'/><title type='text'>ASP.NET MVC 2 Client side validation using jQuery validation plug-in</title><content type='html'>ASP.NET MVC 2 has validation architecture that support both server-side and client-side validation. ScottGu describes in details how to get validation works in his post &lt;a href="http://weblogs.asp.net/scottgu/archive/2010/01/15/asp-net-mvc-2-model-validation.aspx"&gt;ASP.NET MVC 2: Model Validation.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The best feature in client-side architecture is that you may use alternative java scripts validation libraries like jQuery validation.&lt;br /&gt;&lt;br /&gt;There are a steps to get client-side validation works using jQuery validation plug-in:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Download and add to your ASP.NET MVC project following java scripts:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://docs.jquery.com/Downloading_jQuery"&gt;jquery-1.4.2.js&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://bassistance.de/jquery-plugins/jquery-plugin-validation/"&gt;jquery.validate.js&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://aspnet.codeplex.com/releases/view/41742"&gt;MicrosoftMvcJQueryValidation.js&lt;/a&gt; (ASP.NET MVC 2 Futures download)&lt;/li&gt;&lt;/ul&gt;I assume you put all scripts into /Scripts folder of your MVC application&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Enable client side validation&lt;br /&gt;&lt;ul&gt;&lt;li&gt;add three JavaScript references to your view&lt;br /&gt;&lt;img src="http://lh4.ggpht.com/_XoCEelnLy98/S_FN5eg17KI/AAAAAAAAKa8/fqOyPiXhY0I/s800/scriptreferences.png" alt="" /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;write one line of code in the view before form&lt;br /&gt;&lt;img src="http://lh4.ggpht.com/_XoCEelnLy98/S_FOkQ-pAfI/AAAAAAAAKbE/mFq0O2GYDV4/s800/enableclientvalidation.png" alt="" /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ol&gt;That's it! Now you have Client-side validation using jQuery validation plug-in!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5201357166850736293-323380471788156339?l=igorzelmanovich.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://igorzelmanovich.blogspot.com/feeds/323380471788156339/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://igorzelmanovich.blogspot.com/2010/05/aspnet-mvc-2-client-side-validation.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5201357166850736293/posts/default/323380471788156339'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5201357166850736293/posts/default/323380471788156339'/><link rel='alternate' type='text/html' href='http://igorzelmanovich.blogspot.com/2010/05/aspnet-mvc-2-client-side-validation.html' title='ASP.NET MVC 2 Client side validation using jQuery validation plug-in'/><author><name>Igor Zelmanovich</name><uri>https://profiles.google.com/105271231664740991104</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-vJdYr2PbajQ/AAAAAAAAAAI/AAAAAAAAAAA/1iMFigbWLPc/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_XoCEelnLy98/S_FN5eg17KI/AAAAAAAAKa8/fqOyPiXhY0I/s72-c/scriptreferences.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5201357166850736293.post-8624169276063152276</id><published>2010-04-29T12:16:00.000-07:00</published><updated>2010-04-29T13:13:29.785-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='S#arp Arcitecture'/><category scheme='http://www.blogger.com/atom/ns#' term='tools'/><title type='text'>S#arp Arcitecture 1.5 - running T4 teplate error</title><content type='html'>I decided to build some project using &lt;a href="http://sharparchitecture.net/"&gt;S#arp Architecture&lt;/a&gt;. I am using VS 2010.&lt;br /&gt;&lt;br /&gt;I went through all &lt;a href="http://wiki.sharparchitecture.net/VSTemplatesAndCodeGen.ashx"&gt;installation steps&lt;/a&gt; and created my first project S#arp Architecture Application.&lt;br /&gt;&lt;br /&gt;My next step was running scaffolding generator. And then I got the troubles.&lt;br /&gt;&lt;br /&gt;Any time I run custom tool, I get two error messages:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Compiling transformation: Metadata file 'Inflector.Net.dll' could not be found&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Compiling transformation: Metadata file 'SharpArch.Core.dll' could not be found&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I checked the references - they was set correctly. I was stuck but I didn't want to surrender, and after hours of googling and voodoo I got the solution.&lt;br /&gt;&lt;br /&gt;The problem is solved by specifying the absolute path to the referenced assembly in template file (@assembly directive)&lt;br /&gt;&lt;br /&gt;I found two files where &lt;span style="font-style: italic;"&gt;Inflector.Net.dll and &lt;/span&gt;&lt;span style="font-style: italic;"&gt;SharpArch.Core.dll &lt;/span&gt;are referenced:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&lt;solution&gt;[solution folder]\tools\CrudScaffolding\EntityScaffoldingDetails.tt &lt;/solution&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&lt;solution&gt;[solution folder]&lt;/solution&gt;&lt;/span&gt;&lt;span style="font-style: italic;"&gt;&lt;solution&gt;\tools\CrudScaffolding\Templates\BaseTemplate.tt&lt;/solution&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;and replaced following rows&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&lt;#@ assembly name="SharpArch.Core.dll" #&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;with&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&lt;#@ assembly name="&lt;solution&gt;&lt;/solution&gt;&lt;/span&gt;&lt;span style="font-style: italic;"&gt;&lt;solution&gt;[solution folder]&lt;/solution&gt;&lt;/span&gt;&lt;span style="font-style: italic;"&gt;&lt;solution&gt;\lib\SharpArch.Core.dll" #&gt;&lt;/solution&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;and&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&lt;#@ assembly name="Inflector.Net.dll" #&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;with&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&lt;#@ assembly name="&lt;solution&gt;&lt;/solution&gt;&lt;/span&gt;&lt;span style="font-style: italic;"&gt;&lt;solution&gt;[solution folder]&lt;/solution&gt;&lt;/span&gt;&lt;span style="font-style: italic;"&gt;&lt;solution&gt;&lt;/solution&gt;&lt;/span&gt;&lt;span style="font-style: italic;"&gt;&lt;solution&gt;\lib\&lt;/solution&gt;&lt;/span&gt;&lt;span style="font-style: italic;"&gt;Inflector.Net.dll&lt;/span&gt;&lt;span style="font-style: italic;"&gt;" #&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;No error anymore!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5201357166850736293-8624169276063152276?l=igorzelmanovich.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://igorzelmanovich.blogspot.com/feeds/8624169276063152276/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://igorzelmanovich.blogspot.com/2010/04/sarp-arcitecture-15-running-t4-teplate.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5201357166850736293/posts/default/8624169276063152276'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5201357166850736293/posts/default/8624169276063152276'/><link rel='alternate' type='text/html' href='http://igorzelmanovich.blogspot.com/2010/04/sarp-arcitecture-15-running-t4-teplate.html' title='S#arp Arcitecture 1.5 - running T4 teplate error'/><author><name>Igor Zelmanovich</name><uri>https://profiles.google.com/105271231664740991104</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-vJdYr2PbajQ/AAAAAAAAAAI/AAAAAAAAAAA/1iMFigbWLPc/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5201357166850736293.post-8831937818452297067</id><published>2010-03-13T11:07:00.000-08:00</published><updated>2010-03-13T11:11:25.962-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IZWebFileManager'/><title type='text'>IZWebFileManager 2.5.3 has been released</title><content type='html'>IZWebFileManager 2.5.3 has been released&lt;br /&gt;&lt;br /&gt;It includes:&lt;br /&gt;* Thumbnail view fix (http://www.izwebfilemanager.com/forums/thread/445.aspx)&lt;br /&gt;* New Netherlands/Dutch translation (by Marcel van den Arend)&lt;br /&gt;&lt;br /&gt;The release is available for download from Google Code&lt;br /&gt;&lt;a href="https://code.google.com/p/izwebfilemanager/"&gt;https://code.google.com/p/izwebfilemanager/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Cheers!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5201357166850736293-8831937818452297067?l=igorzelmanovich.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://igorzelmanovich.blogspot.com/feeds/8831937818452297067/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://igorzelmanovich.blogspot.com/2010/03/izwebfilemanager-253-has-been-released.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5201357166850736293/posts/default/8831937818452297067'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5201357166850736293/posts/default/8831937818452297067'/><link rel='alternate' type='text/html' href='http://igorzelmanovich.blogspot.com/2010/03/izwebfilemanager-253-has-been-released.html' title='IZWebFileManager 2.5.3 has been released'/><author><name>Igor Zelmanovich</name><uri>https://profiles.google.com/105271231664740991104</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-vJdYr2PbajQ/AAAAAAAAAAI/AAAAAAAAAAA/1iMFigbWLPc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5201357166850736293.post-8716622829956878578</id><published>2010-02-10T08:50:00.000-08:00</published><updated>2010-02-10T09:00:28.792-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='NHibernate'/><title type='text'>Query the database with NHibernate 3.0</title><content type='html'>&lt;b&gt;Introduction&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;NHibernate  gives you many alternative APIs for querying database. There is &lt;a href="https://www.hibernate.org/hib_docs/nhibernate/html/queryhql.html"&gt;HQL&lt;/a&gt;,  which is similar to SQL, &lt;a href="http://ayende.com/Blog/archive/2009/07/26/nhibernate-linq-1.0-released.aspx"&gt;Linq  to NHibernate&lt;/a&gt; and finally &lt;a href="https://www.hibernate.org/hib_docs/nhibernate/html/querycriteria.html"&gt;ICriteria&lt;/a&gt;.&lt;br /&gt;And  once you start to use NHibernate in your project, you have to decide  which API to use. Since NH 3.0 you have one more option. It is &lt;a href="http://nhforge.org/blogs/nhibernate/archive/2009/12/17/queryover-in-nh-3-0.aspx?utm_source=feedburner&amp;amp;utm_medium=feed&amp;amp;utm_campaign=Feed%3A+NHibernateBlog+%28NHibernate+blog%29"&gt;QueryOver  API&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;In this post I want to compare a usage of different  APIs for a simple query.&lt;br /&gt;&lt;br /&gt;For this sample I created a console  application with embedded database. Full source code is available at &lt;a href="http://code.google.com/p/izlabs/source/checkout"&gt;google code&lt;/a&gt;.&lt;br /&gt;In  my sample I have a database with one table Emploee (Id, Name, Age,  Salary) and I want to calculate average salary of employees who's  between 25 to 30 years old.&lt;br /&gt;&lt;br /&gt;Lets start!&lt;br /&gt;&lt;br /&gt;&lt;b&gt;HQL&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Since  I was not familiar with NH (but had an experience with SQL), I found  HQL is easiest way to get started with.&lt;br /&gt;There is query:&lt;br /&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;var salary = session.CreateQuery(&lt;br /&gt;&lt;span class="str"&gt;@"&lt;br /&gt;select&lt;br /&gt;    avg(employee.Salary)&lt;br /&gt;from&lt;br /&gt;    Employee employee&lt;br /&gt;where&lt;br /&gt;    employee.Age &amp;gt;= 25 and employee.Age &amp;lt;=30&lt;br /&gt;"&lt;/span&gt;&lt;br /&gt;).UniqueResult&amp;lt;&lt;span class="kwrd"&gt;double&lt;/span&gt;&amp;gt;();&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Looks  good, readable but not strongly typed.&lt;br /&gt;&lt;br /&gt;Go next one.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;ICriteria&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;The  ICriteria API is NHibernate's implementation of &lt;a href="http://martinfowler.com/eaaCatalog/queryObject.html"&gt;Query Object&lt;/a&gt;.&lt;br /&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;var salary = session.CreateCriteria(&lt;span class="kwrd"&gt;typeof&lt;/span&gt;(Employee))&lt;br /&gt;                    .Add(Restrictions.Between(&lt;span class="str"&gt;"Age"&lt;/span&gt;, 25, 30))&lt;br /&gt;                    .SetProjection(Projections.Avg(&lt;span class="str"&gt;"Salary"&lt;/span&gt;))&lt;br /&gt;                    .UniqueResult&amp;lt;&lt;span class="kwrd"&gt;double&lt;/span&gt;&amp;gt;();&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Much better, but still has some  "magic strings". I am looking for strongly typed code where refactoring  tools like 'Find All References', and 'Refactor-&gt;Rename' will work  perfectly.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Linq&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;NHibernate 3.0 has a built-in Linq  provider.&lt;br /&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;var query = from employee &lt;span class="kwrd"&gt;in&lt;/span&gt; session.Query&amp;lt;Employee&amp;gt;()&lt;br /&gt;            &lt;span class="kwrd"&gt;where&lt;/span&gt; employee.Age &amp;gt;= 25 &amp;amp;&amp;amp; employee.Age &amp;lt;= 30&lt;br /&gt;            select employee.Salary;&lt;br /&gt;&lt;br /&gt;var salary = query.Average();&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Pretty good! Strongly typed, readable. But it  uses the fact that Enumerable has Average in this case. Would we need a  more complicated projection, it would be not available in LINQ. Also,  LINQ syntax is still confusing for some people. It just looks different  than surrounding C# code.  &lt;br /&gt;&lt;br /&gt;Keeping looking for a perfect.  &lt;br /&gt;&lt;br /&gt;&lt;b&gt;QueryOver&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;QueryOver  combines the use of Extension Methods and Lambda Expressions to provide  a statically typesafe wrapper round the ICriteria API.&lt;br /&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;var salary = session.QueryOver&amp;lt;Employee&amp;gt;()&lt;br /&gt;                    .WhereRestrictionOn(e =&amp;gt; e.Age).IsBetween(25).And(30)&lt;br /&gt;                    .Select(e1 =&amp;gt; e1.SelectAvg(e2 =&amp;gt; e2.Salary))&lt;br /&gt;                    .List&amp;lt;&lt;span class="kwrd"&gt;double&lt;/span&gt;&amp;gt;()&lt;br /&gt;                    .Single();&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Perfect!&lt;br /&gt;&lt;br /&gt;In  my opinion this one is the best.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/double&gt;&lt;/employee&gt;&lt;/employee&gt;&lt;/double&gt;&lt;/double&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5201357166850736293-8716622829956878578?l=igorzelmanovich.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://igorzelmanovich.blogspot.com/feeds/8716622829956878578/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://igorzelmanovich.blogspot.com/2010/02/query-database-with-nhibernate-30.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5201357166850736293/posts/default/8716622829956878578'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5201357166850736293/posts/default/8716622829956878578'/><link rel='alternate' type='text/html' href='http://igorzelmanovich.blogspot.com/2010/02/query-database-with-nhibernate-30.html' title='Query the database with NHibernate 3.0'/><author><name>Igor Zelmanovich</name><uri>https://profiles.google.com/105271231664740991104</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-vJdYr2PbajQ/AAAAAAAAAAI/AAAAAAAAAAA/1iMFigbWLPc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5201357166850736293.post-1757428850250586054</id><published>2010-01-05T11:59:00.000-08:00</published><updated>2010-01-05T12:11:00.426-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IZWebFileManager'/><title type='text'>IZWebFileManager 2.5.2 has been released</title><content type='html'>IZWebFileManager 2.5.2 has been released&lt;br /&gt;&lt;br /&gt;It includes:&lt;br /&gt;* FileDownload event&lt;br /&gt;* New Swedish translation (by Peter Strömblad)&lt;br /&gt;* IE8 compatibility fixes&lt;br /&gt;&lt;br /&gt;The release is available for download from Google Code&lt;br /&gt;&lt;a href="https://code.google.com/p/izwebfilemanager/"&gt;https://code.google.com/p/izwebfilemanager/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Cheers!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5201357166850736293-1757428850250586054?l=igorzelmanovich.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://igorzelmanovich.blogspot.com/feeds/1757428850250586054/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://igorzelmanovich.blogspot.com/2010/01/izwebfilemanager-252-has-been-released.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5201357166850736293/posts/default/1757428850250586054'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5201357166850736293/posts/default/1757428850250586054'/><link rel='alternate' type='text/html' href='http://igorzelmanovich.blogspot.com/2010/01/izwebfilemanager-252-has-been-released.html' title='IZWebFileManager 2.5.2 has been released'/><author><name>Igor Zelmanovich</name><uri>https://profiles.google.com/105271231664740991104</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-vJdYr2PbajQ/AAAAAAAAAAI/AAAAAAAAAAA/1iMFigbWLPc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5201357166850736293.post-7785480766608593845</id><published>2009-11-30T04:16:00.000-08:00</published><updated>2009-11-30T06:09:27.143-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='URL Routing'/><title type='text'>Mapping URLs using ASP.NET 2.0  Web Forms</title><content type='html'>ASP.NET 4.0 is coming with new feature - &lt;a href="http://weblogs.asp.net/scottgu/archive/2009/10/13/url-routing-with-asp-net-4-web-forms-vs-2010-and-net-4-0-series.aspx#7251813"&gt;URL routing with ASP.NET Web Forms&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;It is pretty cool feature, but require upgrade up to .NET 4.0.&lt;br /&gt;I am not sure that such a good feature is a real reason to get upgraded, and in most cases you will stay with current version on .NET.&lt;br /&gt;&lt;br /&gt;But I want it and I want it now, with .NET 3.5.  I am going to implement it!&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Requirements&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I want an API as close as possible to .NET 4.0 version:&lt;br /&gt;&lt;br /&gt;RouteCollection.MapPageRoute() helper method in ASP.NET 4.0 to map the "/products/Category_1" URL to a "Products.aspx" page that lives immediately under the application root directory:&lt;br /&gt;&lt;br /&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;void&lt;/span&gt; Application_Start(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, EventArgs e)&lt;br /&gt;{&lt;br /&gt;   &lt;span class="rem"&gt;// Code that runs on application startup&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;   RegisterRoutes(System.Web.Routing.RouteTable.Routes);&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;void&lt;/span&gt; RegisterRoutes(System.Web.Routing.RouteCollection routes)&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;   routes.MapPageRoute(&lt;br /&gt;       &lt;span class="str"&gt;"product-browse"&lt;/span&gt;,&lt;br /&gt;       &lt;span class="str"&gt;"products/{category}"&lt;/span&gt;,&lt;br /&gt;       &lt;span class="str"&gt;"~/Products.aspx"&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Page.GetRouteData() method to retrieve the "category" parameter value mapped using the /products/{category} URL filter.&lt;br /&gt;&lt;br /&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Page_Load(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, EventArgs e)&lt;br /&gt;{&lt;br /&gt;   Label1.Text = (&lt;span class="kwrd"&gt;string&lt;/span&gt;)&lt;span class="kwrd"&gt;this&lt;/span&gt;.GetRouteData().Values[&lt;span class="str"&gt;"category"&lt;/span&gt;];&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Page.GetRouteUrl() helper method to lookup the route within the URL routing system, optionally specify parameters to it, and then retrieve an actual URL that it maps back to.  For example, the below code would retrieve a URL value of “/products/Category_1”:&lt;br /&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Page_Load(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, EventArgs e)&lt;br /&gt;{&lt;br /&gt;   HyperLink1.NavigateUrl =&lt;br /&gt;       &lt;span class="kwrd"&gt;this&lt;/span&gt;.GetRouteUrl(&lt;span class="str"&gt;"product-browse"&lt;/span&gt;, &lt;span class="kwrd"&gt;new&lt;/span&gt; { category = &lt;span class="str"&gt;"Category_1"&lt;/span&gt; });&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Implementation&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;For getting it works I need to implement a IRouteHandler, which will handle all routes I set using MapPageRoute() method:&lt;br /&gt;&lt;br /&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; PageRouteHandler : IRouteHandler, IHttpHandler&lt;br /&gt;{&lt;br /&gt;   &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;readonly&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; _virtualPath;&lt;br /&gt;   &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;object&lt;/span&gt; RouteData = &lt;span class="kwrd"&gt;new&lt;/span&gt; &lt;span class="kwrd"&gt;object&lt;/span&gt;();&lt;br /&gt;&lt;br /&gt;   &lt;span class="kwrd"&gt;public&lt;/span&gt; PageRouteHandler(&lt;span class="kwrd"&gt;string&lt;/span&gt; virtualPath)&lt;br /&gt;   {&lt;br /&gt;      _virtualPath = virtualPath;&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   &lt;span class="preproc"&gt;#region&lt;/span&gt; IRouteHandler Members&lt;br /&gt;&lt;br /&gt;   &lt;span class="kwrd"&gt;public&lt;/span&gt; IHttpHandler GetHttpHandler(RequestContext requestContext)&lt;br /&gt;   {&lt;br /&gt;      HttpContext.Current.Items[RouteData] = requestContext.RouteData;&lt;br /&gt;      &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;this&lt;/span&gt;;&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   &lt;span class="preproc"&gt;#endregion&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;   &lt;span class="preproc"&gt;#region&lt;/span&gt; IHttpHandler Members&lt;br /&gt;&lt;br /&gt;   &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt; IsReusable&lt;br /&gt;   {&lt;br /&gt;      get { &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;false&lt;/span&gt;; }&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; ProcessRequest(HttpContext context)&lt;br /&gt;   {&lt;br /&gt;      context.Server.Transfer(_virtualPath, &lt;span class="kwrd"&gt;true&lt;/span&gt;);&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   &lt;span class="preproc"&gt;#endregion&lt;/span&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;It saves current route data into HttpContext and returns itself as IHttpHandler. Implementation of IHttpHandler might be done in different ways, but I prefer Server.Transfer().&lt;br /&gt;&lt;br /&gt;Next step is implementing of extension methods. Here they are:&lt;br /&gt;&lt;br /&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; MapPageRoute(&lt;span class="kwrd"&gt;this&lt;/span&gt; RouteCollection routes,&lt;br /&gt;   &lt;span class="kwrd"&gt;string&lt;/span&gt; name, &lt;span class="kwrd"&gt;string&lt;/span&gt; url, &lt;span class="kwrd"&gt;string&lt;/span&gt; target)&lt;br /&gt;{&lt;br /&gt;    routes.Add(name, &lt;span class="kwrd"&gt;new&lt;/span&gt; Route(url, &lt;span class="kwrd"&gt;new&lt;/span&gt; PageRouteHandler(target)));&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; RouteData GetRouteData(&lt;span class="kwrd"&gt;this&lt;/span&gt; Page page)&lt;br /&gt;{&lt;br /&gt;    &lt;span class="kwrd"&gt;return&lt;/span&gt; (HttpContext.Current.Items[PageRouteHandler.RouteData] &lt;span class="kwrd"&gt;as&lt;/span&gt; RouteData)&lt;br /&gt;       ?? &lt;span class="kwrd"&gt;new&lt;/span&gt; RouteData();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; GetRouteUrl(&lt;span class="kwrd"&gt;this&lt;/span&gt; Page page, &lt;span class="kwrd"&gt;string&lt;/span&gt; name, &lt;span class="kwrd"&gt;object&lt;/span&gt; values)&lt;br /&gt;{&lt;br /&gt;    &lt;span class="kwrd"&gt;return&lt;/span&gt; GetRouteUrl(page, name, &lt;span class="kwrd"&gt;new&lt;/span&gt; RouteValueDictionary(values));&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; GetRouteUrl(&lt;span class="kwrd"&gt;this&lt;/span&gt; Page page, &lt;span class="kwrd"&gt;string&lt;/span&gt; name,&lt;br /&gt;   RouteValueDictionary values)&lt;br /&gt;{&lt;br /&gt;    &lt;span class="kwrd"&gt;return&lt;/span&gt; RouteTable.Routes.GetVirtualPath(&lt;span class="kwrd"&gt;null&lt;/span&gt;, name, values).VirtualPath;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Summary&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Such Web Forms routing makes it easy to implement clean, SEO friendly, URLs.&lt;br /&gt;It can by used with ASP.NET MVC as well, you can have applications that mix the two.&lt;br /&gt;And it does not require upgrade up to  .NET 4.0.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Resources&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The source code of sample web side I used here might be found at &lt;a href="http://code.google.com/p/izlabs/source/browse/#svn/trunk/UrlPageRouting"&gt;http://code.google.com/p/izlabs/source/browse/#svn/trunk/UrlPageRouting&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5201357166850736293-7785480766608593845?l=igorzelmanovich.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://igorzelmanovich.blogspot.com/feeds/7785480766608593845/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://igorzelmanovich.blogspot.com/2009/11/mapping-urls-using-aspnet-20-web-forms.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5201357166850736293/posts/default/7785480766608593845'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5201357166850736293/posts/default/7785480766608593845'/><link rel='alternate' type='text/html' href='http://igorzelmanovich.blogspot.com/2009/11/mapping-urls-using-aspnet-20-web-forms.html' title='Mapping URLs using ASP.NET 2.0  Web Forms'/><author><name>Igor Zelmanovich</name><uri>https://profiles.google.com/105271231664740991104</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-vJdYr2PbajQ/AAAAAAAAAAI/AAAAAAAAAAA/1iMFigbWLPc/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5201357166850736293.post-8077974881294908817</id><published>2009-11-24T04:54:00.000-08:00</published><updated>2009-11-26T06:45:54.155-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET MVC'/><title type='text'>ASP.NET MVC Model Binding and Model's fields</title><content type='html'>&lt;span&gt;A &lt;a href="http://msdn.microsoft.com/en-us/library/dd410405.aspx"&gt;Model Binding&lt;/a&gt; in MVC provides a simple way to map posted form values to a .NET Framework type and pass the type to an action method as a parameter.&lt;br /&gt;&lt;br /&gt;Everything works fine while a model has public properties like this:&lt;br /&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; Person&lt;br /&gt;{&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; Id {get;set;}&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; Name {get;set;}&lt;br /&gt;    ...&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;But if you try to use public fields instead of properties like this:&lt;br /&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; Person&lt;br /&gt;{&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; Id;&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; Name;&lt;br /&gt;    ...&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span&gt;you will be surprised to get the model passed to controller's action with no assigned fields.&lt;br /&gt;&lt;br /&gt;It happens because ASP.NET MVC use DefaultModelBinder by default which deals with properties but not with fields when map posted form values.&lt;br /&gt;&lt;br /&gt;Of course you can use properties instead of fields wherever you need model bindings. But it is  an annoying limitation.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;ASP.NET MVC allows us to override both the default model binder, as well as add custom model binders, through the ModelBinders static class:&lt;br /&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;ModelBinders.Binders.DefaultBinder = &lt;span class="kwrd"&gt;new&lt;/span&gt; SomeCustomDefaultBinder();&lt;br /&gt;ModelBinders.Binders.Add(&lt;span class="kwrd"&gt;typeof&lt;/span&gt;(Person), &lt;span class="kwrd"&gt;new&lt;/span&gt; PersonModelBinder());&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;There are more blog entries about ASP.NET MVC Model Binding&lt;br /&gt;&lt;a href="http://odetocode.com/Blogs/scott/archive/2009/04/27/6-tips-for-asp-net-mvc-model-binding.aspx"&gt;6 Tips for ASP.NET MVC Model Binding&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.lostechies.com/blogs/jimmy_bogard/archive/2009/03/17/a-better-model-binder.aspx"&gt; A better Model Binder&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5201357166850736293-8077974881294908817?l=igorzelmanovich.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://igorzelmanovich.blogspot.com/feeds/8077974881294908817/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://igorzelmanovich.blogspot.com/2009/11/aspnet-mvc-model-binding-and-models.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5201357166850736293/posts/default/8077974881294908817'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5201357166850736293/posts/default/8077974881294908817'/><link rel='alternate' type='text/html' href='http://igorzelmanovich.blogspot.com/2009/11/aspnet-mvc-model-binding-and-models.html' title='ASP.NET MVC Model Binding and Model&apos;s fields'/><author><name>Igor Zelmanovich</name><uri>https://profiles.google.com/105271231664740991104</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-vJdYr2PbajQ/AAAAAAAAAAI/AAAAAAAAAAA/1iMFigbWLPc/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry></feed>
