代码改变世界

Jumony for MVC现状和展望

2011-04-15 21:51  Ivony...  阅读(3864)  评论(6编辑  收藏  举报

Jumony一直在致力于成为一个优秀的ASP.NET MVC视图引擎,同时也顺便修整一下MVC的种种问题,所以,Jumony for MVC一直是Jumony一个非常重要的子项目,尽管它还没有一个公开的稳定版本,但由于Jumony是一个完全开源的项目,任何人都可以在http://jumony.codeplex.com/下载Jumony最新的源代码,当然也就包含Jumony for MVC。这篇文章简单的介绍下Jumony for MVC的现状和将来的发展方向。

那么首先,Jumony已经作为ASP.NET MVC的一个视图引擎,借助ASP.NET4的特性,Jumony for MVC并不需要任何一行多余的代码,只要你的网站或Web项目引用了Ivony.Html.Web.Mvc的项目或DLL,Jumony for MVC就会自动将自己的视图引擎JumonyViewEngine注册到系统中。默认情况下,JumonyViewEngine呈现出与默认的WebFormViewEngine相似的视图查找逻辑,只不过Jumony查找的是.html和htm文件。特别的,与Jumony for ASP.NET类似,JumonyViewEngine在找到视图文件后,会查找是否存在.html.ashx这样的文件,若存在,且该文件所定义的Handler类型继承于ViewHandler,那么这个ViewHandler就会自动被当作IView对象来返回(ViewHandler实现了IView)。ViewHandler基类提供了处理HTML视图所需要的一切环境,ViewContext或是ViewModel,还有UrlHelper。

为了配合MVC的一些功能,Jumony for MVC也对HTML做了小小的扩展。可以简单的在一个链接(<a>)里面添加action和controller(可选)属性便可以直接使得这个链接变成一个ActionLink,添加其他RouteData的方式也很简单,只需要在名称前面加个下划线就可以了。像是这样:

<a action="Index" controller="Home" _id="1" >Home</a>

MVC中的部分视图,可以使用<partial>标签来实现,<partial>有两种格式,一种是直接指定action和controller(可选)属性,这样,Jumony for MVC会自动调用HtmlHelper.Action方法来执行指定Action并将返回的结果嵌入。另一种则可以设置view属性,指定一个视图名称,这种情况下Jumony for MVC则会调用HtmlHelper.Partial方法。

上述的HTML扩展,不需要html文件附有.html.ashx的视图处理程序,只要是被JumonyViewEngine当作视图的HTML文件,这些HTML扩展便会自动应用。所以很多简单的partial(譬如说页头)或是页面(譬如说信息提示页),可以不需要ashx文件的辅助处理。

Jumony for MVC的部分视图也使用标准的HTML格式,也支持附加的ashx文件支持,只是继承的类型不能是ViewHandler而必须是PartialViewHandler,在将来的版本中,将考虑统一这两者。

除此之外,考虑到ASP.NET MVC行为诡异的默认路由实现。Jumony for MVC还提供了一个简单的路由实现,SimpleRoutingTable。主要针对默认Route莫名其妙的自动继承当前路由值和要命的先到先得机制做了改善。

路由对象先到先得的机制是由RouteCollection的路由查找实现而决定的,所以为了解决这个问题,SimpleRoutingTable把所有的路由规则合并到一个RouteBase对象,也就是SimpleRoutingTable实例,这个实例会按照确定的规则查找最合适的规则(SimpleRoutingRule)来进行路由。任何可能冲突的规则是不能添加到一个SimpleRoutingTable对象中的。

秉承Jumony的传统,Jumony for MVC不仅仅是一款足够优秀的ASP.NET MVC视图引擎,且与现有的视图引擎保持了最大的兼容,在Jumony for MVC的视图中可以嵌入WebForm视图引擎的partial,反之同样可行。

 

以上,就是Jumony for MVC的现状。

展望未来,Jumony for MVC还存在很多未能解决的问题。

 

譬如说<form>的action属性如何指定路由的链接?当然现阶段我们可以简单的在ashx中找出这个<form>元素再调用SetAttribute方法来设置。但直接在HTML中书写显然是更惬意的事情。

当然还有表单验证,尽管Jumony Forms子项目提供了有限的表单验证能力,但如何与MVC的Model验证模型结合起来,又或者有无必要结合(事实上这个依赖于DefaultModelBinder的模型本来就不是那么轻巧)。

Jumony View已经为缓存做好了准备,其实现了ICachableResult接口并可以从产生一个ContentResult用于缓存,如果缓存命中,则可以直接用这个ContentResult来代替ViewResult从而提高性能。但着需要Controller层面的配合。所以Jumony正在准备自己的JumonyController。

对于一些简单的数据绑定,我们也会希望是不是可以用简单的HTML扩展来完成,例如:

<a action="Detail" controller="News">
  <binding source="ViewModel" property="Title" target=":text" />
  <binding source="ViewModel" property="ID" target="_id" 
/>
</
a
>

 

最后,Jumony for MVC作为ASP.NET MVC的一款视图引擎,借助Jumony强大的HTML能力,使得ASP.NET MVC的View返璞归真,最大程度上接近原始的HTML而非代码和HTML的杂凑,是非常值得一试的一个视图引擎。