<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Visual David .Net</title>
	<atom:link href="http://visualdavid.net/feed/" rel="self" type="application/rss+xml" />
	<link>http://visualdavid.net</link>
	<description>David (Dawei) Li&#039;s personal web site.</description>
	<lastBuildDate>Sat, 30 Jul 2011 13:39:40 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	
		<item>
		<title>ASP.NET MVC 3: 如何写一个支持unobtrusive客户端验证的Email Validation Attribute</title>
		<link>http://visualdavid.net/2011/07/30/asp-net-mvc-3-how-to-write-an-email-validation-attribute-with-unobtrusive-client-side-validation-support/</link>
		<comments>http://visualdavid.net/2011/07/30/asp-net-mvc-3-how-to-write-an-email-validation-attribute-with-unobtrusive-client-side-validation-support/#comments</comments>
		<pubDate>Sat, 30 Jul 2011 13:30:29 +0000</pubDate>
		<dc:creator>David Li</dc:creator>
				<category><![CDATA[ASP.NET MVC]]></category>
		<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[MVC]]></category>

		<guid isPermaLink="false">http://visualdavid.net/?p=154</guid>
		<description><![CDATA[ASP.NET MVC 3引入了对Unobtrusive Javascript的支持，结合jQuery Valiator插件，让客户端验证的Javascript代码与Html剥离开，使得页面代码更清晰简洁。关于如何使用，请猛击这里。 当需要验证一个Email字段是否合法，只需像ASP.NET MVC 2那样，使用RegularExpressionAttribute修饰一下即可。 ASP.NET MVC 会自动与jQuery Validator绑定，实现客户端的验证。而需要重用这个Email的验证时，只需自己写一个定制的EmailValidationAttribute。 并用它来代替RegualrExpressionAttribute加到属性上面。 这样做看似没有问题，但运行后发现，只有服务器端验证，而客户端验证并没有工作，这是为什么呢？ 原来，ASP.NET MVC 3是通过IClientValidatable这个新的接口来实现客户端验证的，也就是说所有的要支持客户端验证的Attribute必须实现这个接口。 但RegualrExpressionAttribute并不是定义在MVC里面的，而是随着.NET 4.0发布的，放在System.ComponentModel.DataAnnotations.dll这个assembly里面，那他是如何实现客户端验证的呢？ 查看一下MVC的源代码，发现其为这几个著名的DataAnnotation加了个Adapter。 而这Adapter做的事情，正是IClientValidatable接口需要做的，返回其ModelClientValidationRule。 所以，相应的，把这个正则表达式的ModelClientValidationRule加到Email验证里面就大功告成了。 Charles Vallance有一个直接的解决方案，定义一个ModelClientValidationRule，并将ValidationType设置为“email”。这样做也可以，但有一个问题。实际上，ValidationType对应的是jQuery Validator中定义的email验证方法。 查看jQuery Validator的源代码就可以发现，其使用的正则表达式比我们在服务器端使用的要复杂得多。此时，客户端验证与服务器端验证并不统一，留下后患。]]></description>
			<content:encoded><![CDATA[<p>ASP.NET MVC 3引入了对<a title="Unobstrusive Javascript" href="http://en.wikipedia.org/wiki/Unobtrusive_JavaScript" target="_blank">Unobtrusive Javascript</a>的支持，结合jQuery Valiator插件，让客户端验证的Javascript代码与Html剥离开，使得页面代码更清晰简洁。关于如何使用，请猛击<a title="Creating a MVC 3 Application with Razor and Unobtrusive JavaScript " href="http://www.asp.net/mvc/tutorials/creating-a-mvc-3-application-with-razor-and-unobtrusive-javascript" target="_blank">这里</a>。</p>
<p>当需要验证一个Email字段是否合法，只需像ASP.NET MVC 2那样，使用RegularExpressionAttribute修饰一下即可。</p>
<pre class="brush: csharp; title: ; notranslate">
[RegularExpression(@&quot;[a-z0-9!#$%&amp;'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&amp;'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?&quot;, ErrorMessage = &quot;Invalid Email address.&quot;)]
public string Email { get; set; }
</pre>
<p>ASP.NET MVC 会自动与jQuery Validator绑定，实现客户端的验证。而需要重用这个Email的验证时，只需自己写一个<a title="Creating a Custom [Email] Validation Attribute" href="http://weblogs.asp.net/scottgu/archive/2010/01/15/asp-net-mvc-2-model-validation.aspx" target="_blank">定制的EmailValidationAttribute</a>。</p>
<pre class="brush: csharp; title: ; notranslate">
public class EmailAttribute : RegularExpressionAttribute
{
    public EmailAttribute()
        : base(@&quot;[a-z0-9!#$%&amp;'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&amp;'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?&quot;)
    { }
}
</pre>
<p>并用它来代替RegualrExpressionAttribute加到属性上面。</p>
<pre class="brush: csharp; title: ; notranslate">
[Email(ErrorMessage = &quot;Invalid Email address.&quot;)]
public string Email { get; set; }
</pre>
<p>这样做看似没有问题，但运行后发现，只有服务器端验证，而客户端验证并没有工作，这是为什么呢？<br />
原来，ASP.NET MVC 3是通过IClientValidatable这个新的接口来实现客户端验证的，也就是说所有的要支持客户端验证的Attribute必须实现这个接口。<br />
但RegualrExpressionAttribute并不是定义在MVC里面的，而是随着.NET 4.0发布的，放在System.ComponentModel.DataAnnotations.dll这个assembly里面，那他是如何实现客户端验证的呢？<br />
查看一下<a title="MVC的源代码" href="http://aspnet.codeplex.com/wikipage?title=MVC" target="_blank">MVC的源代码</a>，发现其为这几个著名的DataAnnotation加了个Adapter。</p>
<pre class="brush: csharp; title: ; notranslate">
typeof(RegularExpressionAttribute),
    (metadata, context, attribute) =&gt; new RegularExpressionAttributeAdapter(metadata, context, (RegularExpressionAttribute)attribute)
</pre>
<p>而这Adapter做的事情，正是IClientValidatable接口需要做的，返回其ModelClientValidationRule。</p>
<pre class="brush: csharp; title: ; notranslate">
public override IEnumerable&lt;ModelClientValidationRule&gt; GetClientValidationRules() {
    return new[] { new ModelClientValidationRegexRule(ErrorMessage, Attribute.Pattern) };
}
</pre>
<p>所以，相应的，把这个正则表达式的ModelClientValidationRule加到Email验证里面就大功告成了。</p>
<pre class="brush: csharp; title: ; notranslate">
public class EmailAttribute : RegularExpressionAttribute, IClientValidatable
{
    public EmailAttribute()
    : base(@&quot;[a-z0-9!#$%&amp;'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&amp;'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?&quot;)
    { }

    public IEnumerable&lt;ModelClientValidationRule&gt; GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
    {
        return new[] { new ModelClientValidationRegexRule(this.ErrorMessage, this.Pattern) };
    }
}
</pre>
<p>Charles Vallance有一个直接的<a title="ASP.NET MVC 3 Email Validation with Unobtrusive jQuery Validation" href="http://www.pagedesigners.co.nz/2011/02/asp-net-mvc-3-email-validation-with-unobtrusive-jquery-validation/" target="_blank">解决方案</a>，定义一个ModelClientValidationRule，并将ValidationType设置为“email”。这样做也可以，但有一个问题。实际上，ValidationType对应的是jQuery Validator中定义的<a title="Plugins/Validation/Methods/email" href="http://docs.jquery.com/Plugins/Validation/Methods/email" target="_blank">email验证方法</a>。</p>
<pre class="brush: jscript; title: ; notranslate">
email: function(value, element) {
    // contributed by Scott Gonzalez: http://projects.scottsplayground.com/email_address_validation/
    return this.optional(element) || /^((([a-z]|\d|[!#\$%&amp;'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&amp;'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$/i.test(value);
},
</pre>
<p>查看jQuery Validator的源代码就可以发现，其使用的正则表达式比我们在服务器端使用的要复杂得多。此时，客户端验证与服务器端验证并不统一，留下后患。</p>
]]></content:encoded>
			<wfw:commentRss>http://visualdavid.net/2011/07/30/asp-net-mvc-3-how-to-write-an-email-validation-attribute-with-unobtrusive-client-side-validation-support/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ASP.NET MVC 3: CS1973编译错误</title>
		<link>http://visualdavid.net/2011/03/04/asp-net-mvc-3-cs1973-compile-error/</link>
		<comments>http://visualdavid.net/2011/03/04/asp-net-mvc-3-cs1973-compile-error/#comments</comments>
		<pubDate>Fri, 04 Mar 2011 12:37:23 +0000</pubDate>
		<dc:creator>David Li</dc:creator>
				<category><![CDATA[ASP.NET MVC]]></category>
		<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[MVC]]></category>

		<guid isPermaLink="false">http://visualdavid.net/?p=133</guid>
		<description><![CDATA[今天在写代码的时候碰到一个CS1973编译错误。 代码如下： 发现问题了吗？下面是错误描述： Compiler Error Message: CS1973: &#8216;System.Web.Mvc.HtmlHelper&#60;object&#62;&#8217; has no applicable method named &#8216;TextBox&#8217; but appears to have an extension method by that name. Extension methods cannot be dynamically dispatched. Consider casting the dynamic arguments or calling the extension method without the extension method syntax. 通过描述发现，问题是出在ASP.NET MVC 3新引入的ViewBag上面，由于它实际是一个dynamic类型，而dynamic类型又不能使用扩展方面(Extension Method)。因为扩展方面是编译时的，是将扩展的类型传入静态方法。但dynamic的机制是运行时的，他需要运行时解析数据类型并调用其方法或属性。如果将dynamic类型传入扩展方法，编译器将无法选择合适的重载方法，将抛出此编译错误，注意是编译错误。 所以修复这问题的方法就是加一个类型转换，告诉编译器我们要调用哪个重载。 参考： ViewBag in ASP.NET MVC [...]]]></description>
			<content:encoded><![CDATA[<p>今天在写代码的时候碰到一个CS1973编译错误。</p>
<p>代码如下：</p>
<pre class="brush: csharp; title: ; notranslate">
&lt;%: Html.TextBox(&quot;Hello&quot;, ViewBag.Value) %&gt;
</pre>
<p>发现问题了吗？下面是错误描述：</p>
<blockquote><p><strong>Compiler Error Message: </strong>CS1973: &#8216;System.Web.Mvc.HtmlHelper&lt;object&gt;&#8217;  has no applicable method named &#8216;TextBox&#8217; but appears to have an extension method  by that name. Extension methods cannot be dynamically dispatched. Consider  casting the dynamic arguments or calling the extension method without the  extension method syntax.</p></blockquote>
<p>通过描述发现，问题是出在ASP.NET MVC 3新引入的ViewBag上面，由于它实际是一个dynamic类型，而dynamic类型又不能使用扩展方面(Extension Method)。因为扩展方面是编译时的，是将扩展的类型传入静态方法。但dynamic的机制是运行时的，他需要运行时解析数据类型并调用其方法或属性。如果将dynamic类型传入扩展方法，编译器将无法选择合适的重载方法，将抛出此<strong>编译错误</strong>，注意是<strong>编译错误</strong>。</p>
<p>所以修复这问题的方法就是加一个类型转换，告诉编译器我们要调用哪个重载。</p>
<pre class="brush: csharp; title: ; notranslate">
&lt;%: Html.TextBox(&quot;Hello&quot;, (string)ViewBag.Value) %&gt;
</pre>
<p>参考：</p>
<ul>
<li><a href="http://davidhayden.com/blog/dave/archive/2011/01/19/ViewBagAspNetMvc3.aspx">ViewBag in ASP.NET MVC 3 &#8211; Dynamic Wrapper Around ViewData Backing Store</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://visualdavid.net/2011/03/04/asp-net-mvc-3-cs1973-compile-error/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>换成了Thematic皮肤</title>
		<link>http://visualdavid.net/2010/04/04/switch-theme-to-thematic/</link>
		<comments>http://visualdavid.net/2010/04/04/switch-theme-to-thematic/#comments</comments>
		<pubDate>Sun, 04 Apr 2010 05:43:05 +0000</pubDate>
		<dc:creator>David Li</dc:creator>
				<category><![CDATA[站务相关 (Site)]]></category>
		<category><![CDATA[Thematic]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://visualdavid.net/?p=67</guid>
		<description><![CDATA[四处闲逛，发现一个Best Word Press Themes站点，推荐了很多优秀的主题，包括免费的收费的。其中有个top10，排名第一的就是Thematic，预览了一下截图，感觉很好，是我想要的淡雅的风格。遂下载安装设置，哇默认竟然提供了这么多的container，甚是满意，Theme主页http://themeshaper.com/thematic/。 这款Theme的优秀之处，并不在于它的配色插图设计等，而是它提供了一个框架，可以让主题使用者很容易的在上面做二次设计(Design)，正好适合我这种WP入门者，引用作者的话： Thematic is a free, open-source, highly extensible, search-engine optimized WordPress Theme Framework featuring 13 widget-ready areas, grid-based layout samples, styling for popular plugins, and a whole community behind it. It&#8217;s perfect for beginner bloggers and WordPress development professionals. 并且作者在此主题框架的基础上，已经做出许多个扩展主题，并且也可以把自己扩展的主题，会发给作者，优秀者会在页面上展示出来。这让我突然想起了ZenGarden，web design界的MOMO熊，拿一张画板，让想象力去填充。]]></description>
			<content:encoded><![CDATA[<p>四处闲逛，发现一个<a title="Best Word Press Themes" href="http://www.bestwpthemes.com/" target="_blank">Best Word Press Themes</a>站点，推荐了很多优秀的主题，包括免费的收费的。其中有个top10，排名第一的就是<a title="Thematic" href="http://www.bestwpthemes.com/thematic/" target="_blank">Thematic</a>，预览了一下截图，感觉很好，是我想要的淡雅的风格。遂下载安装设置，哇默认竟然提供了这么多的container，甚是满意，Theme主页<a href="http://themeshaper.com/thematic/" target="_blank">http://themeshaper.com/thematic/</a>。</p>
<p>这款Theme的优秀之处，并不在于它的配色插图设计等，而是它提供了一个框架，可以让主题使用者很容易的在上面做二次设计(Design)，正好适合我这种WP入门者，引用作者的话：</p>
<blockquote><p>Thematic is a free, open-source, highly extensible, search-engine optimized <em>WordPress Theme Framework</em> featuring 13 widget-ready areas, grid-based layout samples, styling for popular plugins, and a whole community behind it. It&#8217;s perfect for beginner bloggers and WordPress development professionals.</p></blockquote>
<p>并且作者在此主题框架的基础上，已经做出许多个<a title="http://themeshaper.com/category/thematic-child-themes/" href="http://themeshaper.com/category/thematic-child-themes/" target="_blank">扩展主题</a>，并且也可以把自己扩展的主题，会发给作者，优秀者会在页面上展示出来。这让我突然想起了<a title="Css Zen Garden" href="http://www.csszengarden.com/" target="_blank">ZenGarden</a>，web design界的MOMO熊，拿一张画板，让想象力去填充。</p>
]]></content:encoded>
			<wfw:commentRss>http://visualdavid.net/2010/04/04/switch-theme-to-thematic/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Visual David .Net 正式开张</title>
		<link>http://visualdavid.net/2010/04/03/visual-david-net-is-now-open/</link>
		<comments>http://visualdavid.net/2010/04/03/visual-david-net-is-now-open/#comments</comments>
		<pubDate>Sat, 03 Apr 2010 05:31:49 +0000</pubDate>
		<dc:creator>David Li</dc:creator>
				<category><![CDATA[站务相关 (Site)]]></category>
		<category><![CDATA[VisualDavid.Net]]></category>

		<guid isPermaLink="false">http://visualdavid.net/?p=40</guid>
		<description><![CDATA[经过几周的调研， 一天的艰苦奋斗，终于把域名主机跟wordpress都倒弄起来了。初看上去，效果还凑合，用了Benoît «LeBen» Burgener 的Smooth主题，灰蒙的淡雅看起来不错。 可惜的是作者用的一个文字特效很难支持中文这种大字符集（因为要将文字动态转换为位图），又自己改了一下，而且同样的字体，中文字总是看起来小一点，看来css应该支持不同字符集的字体设置。希望能找到一个好的免费的素雅的模板。 Gallery用了下载量超高的NextGEN，不过对wordpress还不太熟悉，不晓得怎么优雅的把它们link出来，改天再弄吧。 用了SyntaxHighligher，来显示代码，先试用试用， 贴一段儿：]]></description>
			<content:encoded><![CDATA[<p>经过几周的调研， 一天的艰苦奋斗，终于把域名主机跟wordpress都倒弄起来了。初看上去，效果还凑合，用了<a href="http://www.benoitburgener.com/" target="_blank">Benoît «LeBen» Burgener</a> 的Smooth主题，灰蒙的淡雅看起来不错。 可惜的是作者用的一个文字特效很难支持中文这种大字符集（因为要将文字动态转换为位图），又自己改了一下，而且同样的字体，中文字总是看起来小一点，看来css应该支持不同字符集的字体设置。希望能找到一个好的免费的素雅的模板。</p>
<p>Gallery用了下载量超高的<a title="NextGEN Gallery" href="http://alexrabe.de/wordpress-plugins/nextgen-gallery/" target="_blank">NextGEN</a>，不过对wordpress还不太熟悉，不晓得怎么优雅的把它们link出来，改天再弄吧。</p>
<p>用了<a title="Syntax Highlighter" href="http://alexgorbatchev.com" target="_blank">SyntaxHighligher</a>，来显示代码，先试用试用， 贴一段儿：</p>
<pre class="brush: csharp; title: ; notranslate">
//Hello.cs
using System;
public static void Main(){
    Console.WriteLine(&quot;Hello World, I'm Visual David .Net&quot;);
}
</pre>
<pre class="brush: jscript; title: ; notranslate">
(function foo(){
alert(&quot;Hello World, I'm Visual David .Net&quot;);
})();
</pre>
]]></content:encoded>
			<wfw:commentRss>http://visualdavid.net/2010/04/03/visual-david-net-is-now-open/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>

