Lostinet

Lostinet
随笔 - 17, 文章 - 0, 评论 - 281, 引用 - 4
数据加载中……

近况:AbstractRecord改名为RuntimeEntity,以及一个MVC框架的预告.

AbstractRecord这个名字不是很好,因为我不是太喜欢AEIOU开头的名词.
所以我选择了一个在google上,记录很少的名字,作为这个数据库访问框架的名字:RuntimeEntity
这个框架远在8月份就已经完成了一大半.然后就停止了.因为这段时间无论是工作还是生活,都有更加重要的事情要做.
这个星期将完成那些重要的事情,我会用业余的时间,整理一下RuntimeEntity,然后发布一个预览版本.

这次写BLOG,完全是受微软ASP.NET MVC的刺激.
微软的新的MVC框架, 似乎抛弃了ASP.NET控件,抛弃了ASP.NET AJAX.
回归到纯粹Render HTML的地步.我完全无法理解微软的这个做法.

当然,在那个MVC中,程序员仍然可以用XmlHttpRequest,或者其他封装好的框架去进行AJAX,
但是ASP.NET AJAX呢?没有回发,这不止否认了ASP.NET AJAX,甚至还否认了ASP.NET本身.

微软这么大的公司,难道就没有一条兼容控件和ASP.NET AJAX的做法吗?
甚至沦落到被人骂是抄袭也在所不惜? 新的MVC框架出来了对ASP.NET又有什么意义?
为了变相承认,ASP.NET的控件模式已经不适合WEB的发展了?

请大家宽恕我对MS这么严厉的指控. 我的目的纯粹是想突出我的MVC框架的特色 : 支持控件的模板引擎.
其实当初, 我做的不是MVC, 而只是需要实现一个模板引擎, 用于把视图分离出来, 方便美工.
和网上的其他模板引擎是类似的, 利用PropertyBag和后期绑定, 把内容显示出来.
不同的地方只是语法方面很针对美工的编程水平, 做到条件和循环语句非常简单和适合WYSIWYG.

但是我把我的设计推荐给老板时, 一下就被否决了 : ASP.NET控件怎么办 ?
是的. 如果一个新的东西, 抛弃了太多成熟的技术, 那么固然这个新东西的设计可以更加自由.
但是这个新的东西, 能让人接受吗? 如果微软做一个, 那么依然会有很多人追捧. 再难也会有人接受.
但是像我这样微不足道的人, 要推广自己的技术, 就不是那么简单了.

就像MS内某位语言大师说的一样, DotNet在设计的时候, 为了兼容老的程序, 为了和不同程序之间的整合,
提供了很多"救生圈". DotNet的Interop就是一个很好的例子.

当我做RuntimeEntity的时候,提供了SQL语句的支持,就有人质疑了.
要分清楚的是,搞科研和搞工程是2回事.
现在我要做的东西,一定要是一种过渡的方案,既提供新的功能,又要和老功能兼容.

综上,我对我的模板引擎进行了革新. 让它支持ASP.NET的Control,Postback和AJAX.

其实其中的原理, 是非常简单的. 换个说法, 如果把这个引擎,说成是 "Layout", 我想会更加容易让人理解.

看看传统的ASP.NET页面 :
Test.aspx:
<table>
 <tr><td>Username:</td><td><asp:TextBox runat=server ID=Username></td></tr>
 <tr><td>Password:</td><td><asp:TextBox runat=server ID=Password></td></tr>
 <tr><td>&nbsp;</td><td><asp:Button runat=server ID="LoginBtn" Text="Login"></td></tr>
</table>

新的Layout方案:
Test.aspx:
<asp:TextBox runat=server ID=Username>
<asp:TextBox runat=server ID=Password>
<asp:Button runat=server ID="LoginBtn" Text="Login">

Test.view.html:
<table>
 <tr><td>Username:</td><td>{#render Username}</td></tr>
 <tr><td>Password:</td><td>{#render Password}</td></tr>
 <tr><td>&nbsp;</td><td>{#render LoginBtn}</td></tr>
</table>

新的方案把一个ASPX文件, 分割出另外一个html,用于装载Layout.
可以看到的是, 新的Test.aspx本身,已经完全没有排版了.
里面纯粹就是放置大量程序用到的控件.
而在Test.view.html,则定义了这个页面的布局.

把控件Render到Template中,就是这个MVC方案兼容ASP.NET的核心思想.

做到这一步,这个MVC框架就和其他的纯粹生成HTML的框架完全不同了.

1. 如何支持MasterPage?
Test.view.html的输出过程是这样的:
Page.Render -> MasterPage.Render -> MVC.Render -> 整合Test.view.html+控件
也就是说,这个模板的输出目标, 不是Response, 而是控件Render过程中的一个部分.
这个部分的内容被MasterPage包围着, 所以能很方便地应用上MasterPage.

2. 如何做到回发?
回发和回发后调用控件的事件,是ASP.NET最重要的思想. 也是我不能离开ASP.NET的原因.
其他的所谓[ControllerAction],都不会比这个方便.因为ViewState能传递很多东西,而QueryString不能.
就如MasterPage的流程一样,控件被Render出去后,是和ASP.NET的回发机制兼容的.
当页面回发时,ASP.NET的其他基础流程依然能正常运作.
换个角度来说,这个MVC框架处理的只是Render的过程,改变了控件在浏览器上的位置.
这完全不会对ASP.NET的页面生命期造成任何影响.

3. 如何支持ASP.NET AJAX?
ASP.NET AJAX不愧是一种优秀的局部SmartNaviagtion方案.
它让程序员不需要花精力到DHTML中就能实现界面的局部刷新.
它的实现的机制,是通过拦截Page的Render过程,提取需要刷新的内容来返回给客户端.
这样一来,它就和我的MVC冲突了 : 2个都尝试拦截Render过程的东西, 又怎能放在一起工作 ?
这个MVC能支持AJAX的原因是, MVC拦截的不是Page,而只是内部一个控件的Render过程.
过程是 : AJAX-Page.Render -> Form.Render -> UpdatePanel.Render -> MVC.Render
可以看到的是, MVC.Render的过程, 是被包在UpdatePanel的Render里.
所以MVC生成的内容, 能够通过AJAX发送到客户端, 更新客户端的HTML.

---
其实这帖与其说是介绍帖,还不如说是技术研究帖.
希望能给各template的开发者一个新的思路.

posted on 2007-10-11 14:09 Lostinet 阅读(2184) 评论(34)  编辑 收藏 所属分类: WOW

评论

#1楼    回复  引用  查看    

微软也不知道如何继承与创新了。
但,我想微软不能把它的特点给丢了。。。。。。。。。。。。。。
2007-10-11 14:32 | MYOOP      

#2楼    回复  引用  查看    

如果这样,你与简单的 <%= %>有什么区别,只是比这复杂一点而以。

2007-10-11 14:40 | Axel      

#3楼    回复  引用  查看    

我想微软MVC的目的,就是不想有视图状态,不想有postback,不想有复杂的页面生命周期,因为这样可以更轻,效率更高(当然不是开发效率)
2007-10-11 14:41 | Axel      

#4楼    回复  引用  查看    

博主和楼上的兄弟你们都想的太多了。
MS不会把webform丢掉,MS MVC只是一个框架,不会拿来覆盖webform的.
2007-10-11 14:42 | 橘子&猪      

#5楼    回复  引用  查看    

你这样的mvc不叫mvc了吧,而且有了postback,也没有了速度的优势。而且开发速度比webform还慢,不知道有何用处。要用模板的话,只要符合web标准,用css可以随意改变布局,用不着你那样,你那种table布局方式就有问题
2007-10-11 14:44 | 卖糕的      

#6楼    回复  引用  查看    

视图状态是性能的硬伤,尤其在做一些门户网站类型项目的时候,这个问题很严重,现实情况就是这样,基本没有什么大网站是用asp.net做的,即使有的话这些网站很多访问量大的网页里面都没有视图状态的。增加了mvc模式其实对asp.net的一种扩展,可以让asp.net进入大型门户网站开发的领域,没什么不好的,MVC和webform各有各有的市场,相互不冲突,MVC不会取代webform的。
2007-10-11 15:00 | kiler      

#7楼    回复  引用  查看    

@Axel
同意

在给老的BC程序员讲asp.net的时候,到视图状态的时候还好点,一到postback就完了.
就拿服务器端的页面生存周期来说,我一直以来都以为这是微软将错就错的叫法,严格的说是一个Handler处理周期还差不多.不过说真正的页面周期也很难划定范围,以一个页面文件为准的话或许还多少能站住脚.
说到头来都是那个http,其实莫不如推翻http重新制定一个协议,这样世界就清静了,就不会有这么多的争吵.呵呵,以上纯属玩笑.
2007-10-11 15:03 | aspnetx      

#8楼    回复  引用  查看    

@kiler
记得asp的版本是到3,asp.net也快了吧
个人的一个大胆的预测,现在的mvc出行相对于asp.net,就相当于当初的asp.net相对于asp
不也是同时存在并且有不同规模的应用么,而且,确实也是先进了.

至于mvc取代webform与否,这个问题就像回答现在asp.net有没有取代asp一样难以回答.
2007-10-11 15:06 | aspnetx      

#9楼    回复  引用  查看    

不错的思路,利用Aspx页面做控件方面的codefile,而利用单纯的html做布局,楼主独辟蹊径,受教^_^

感觉楼主还可以再进一步。

现在的aspx和html之间的松耦合(control id),容易导致变故,而且出现问题。

建议再抽象出一个数据源,然后aspx和html都通过数据源指定render的对象,修改后的方案可能如下:

Test.aspx:
<asp:TextBox runat=server ID=txtUsername DataField="UserName">
<asp:TextBox runat=server ID=txtPassword DataField="Password">
<asp:Button runat=server ID="LoginBtn" Text="Login">

Test.view.html:
<table>
 <tr><td>Username:</td><td>{#render Username}</td></tr>
 <tr><td>Password:</td><td>{#render Password}</td></tr>
 <tr><td>&nbsp;</td><td>{#render LoginBtn}</td></tr>
</table>




DataSource
{
UserName:
Password:
}

 

并且做一个Vs插件,提供字段拖拽到页面的功能,那就完美了:)

2007-10-11 15:16 | 浪子      

#10楼    回复  引用  查看    

好像和 .Text 的皮肤原理差不多。但现在是纯 html 的模板了,应该对美工更方便。
2007-10-11 15:17 | 木野狐(Neil Chen)      

#11楼    回复  引用  查看    

@aspnetx

事实上asp.net没有取代asp,尤其是在网站这块,国内还有不少大的网站使用asp做的,但是基本上没有用asp.net做的。
2007-10-11 15:20 | kiler      

#12楼    回复  引用  查看    

@Lostinet

控件模板里面的 HTML 布局怎么办?

ItemTemplate, EditItemTemplate, .. 这些
2007-10-11 15:24 | 木野狐(Neil Chen)      

#13楼    回复  引用  查看    

@kiler
是的,咱要表达的就是这个意思.
2007-10-11 15:29 | aspnetx      

#14楼    回复  引用    

@kiler
up
2007-10-11 15:38 | lex [未注册用户]

#15楼    回复  引用    

--引用--------------------------------------------------
kiler: 视图状态是性能的硬伤,尤其在做一些门户网站类型项目的时候,这个问题很严重,现实情况就是这样,基本没有什么大网站是用asp.net做的,即使有的话这些网站很多访问量大的网页里面都没有视图状态的。增加了mvc模式其实对asp.net的一种扩展,可以让asp.net进入大型门户网站开发的领域,没什么不好的,MVC和webform各有各有的市场,相互不冲突,MVC不会取代webform的。
--------------------------------------------------------

刚才是顶这句
2007-10-11 15:38 | lex [未注册用户]

#16楼    回复  引用  查看    

还没有厌倦没完没了的postback吗?
2007-10-11 16:40 | xiao_p      

#17楼    回复  引用  查看    

@kiler
严重同意你的意见,因为现在我在开发一个每天有几十万个用户访问的页面使用的都是静态页面,维护起来很麻烦,但愿新的MVC框架就是用来弥补这方面的不足的
2007-10-11 16:46 | Clark Zheng      

#18楼 [楼主]   回复  引用  查看    

可以和必须,是2回事.

我的方案 , 可以引用控件, 可以支持回发事件 , 可以支持ASP.NET AJAX.

这是多一种选择, 而不是要求必须使用这个方案.

因为既然是模板, 里面支持着各种数据绑定 , 条件 , 循环等等.
即使不使用任何控件, 依然可以达到任何模板引擎的效果.
这些不是本文重点 , 所以在这里就不介绍了.

另外文中没有介绍cs中的代码,所以一般理解起来不容易.
因为大部分逻辑代码都是在cs中进行的. 包括设置控件的值, 处理回发事件等等.

值得一提的是, 里面支持一种 {#bindedit objpath property}的语法,
根据配置,Attribute,代码等多种控制手段, 自动生成编辑属性的控件, 自动设置控件的值, 以及回发的时候与对象属性的同步等等.


关于ITemplate,这个依然是在aspx/ascx里设置. 可惜的就是view.html不能定制ITemplate的内容了.


2007-10-11 16:49 | Lostinet      

#19楼    回复  引用  查看    

同意@kiler,我特别想表达与你一样的观点。
2007-10-11 17:06 | 阿不      

#20楼    回复  引用  查看    

希望能早日看到你的RuntimeEntity和MVC,微软发布产品还有那么多人唧唧歪歪,更何况个人呢?穿别人的鞋走自己的路,让别人去找吧:)
2007-10-11 17:48 | Alex wu      

#21楼    回复  引用    

强烈关注!
2007-10-11 18:06 | 活靶子 [未注册用户]

#22楼    回复  引用    

兄弟们,myspace.com就是asp.net ,一天几亿的PV,也没见什么问题啊
2007-10-11 18:38 | weef [未注册用户]

#23楼    回复  引用  查看    

@weef

myspace这样的网站毕竟是少数,大多数网站是不会用webcontrol的,你不信看看微软的首页,虽然是aspx,但是页面没有任何viewstate的。即便是myspace.com好像首页也是禁用了viewstate吧,禁用了viewstate的webform还有什么意义呢?
2007-10-11 18:59 | kiler      

#24楼    回复  引用  查看    

好多人回复呀。
我想说一下我的想法——换模版的思路——以前做网站的时候用过的。现在做网站了,不用了。

先提几个问题吧:
1、美工熟悉什么样的方式?
2、asp.net需要什么样的方式?

3、二者如何转换?

回答:
1、美工熟悉的是这样的
<table>
<tr><td>Username:</td><td>{文本框,用户名}</td></tr>
<tr><td>Password:</td><td>{文本框,密码}</td></tr>
<tr><td>&nbsp;</td><td>{按钮,提交}</td></tr>
</table>

(淡然一可以把 table 换成 div 的形式)

2、asp.net需要的是这样的
<table>
<tr><td>Username:</td><td><asp:TextBox runat=server ID=txtUsername DataField="UserName"></td></tr>
<tr><td>Password:</td><td><asp:TextBox runat=server ID=txtPassword DataField="Password"></td></tr>
<tr><td>&nbsp;</td><td><asp:Button runat=server ID="LoginBtn" Text="Login"></td></tr>
</table>

3、如何转换呢?
其实很简单了,程序员会怎么办呢?把美工作好的页面拿过来,在需要的地方换成asp.net的控件,编写后台的代码。ok了。

写一个程序让美工填入(复制粘贴)html代码,在由程序转换(替换replace)成服务器控件的形式就可以了。在保存成aa.aspx的页面。

因为是换模版,所以呢,asp.net的控件是不变的,变的是html的代码,布局了什么的。

好像没说明白,先说这么多吧。提出一个思路先,


2007-10-11 19:09 | 金色海洋(jyk)      

#25楼    回复  引用  查看    

我相信MS的MVC框架会考虑很周全的
至于MS要取代ASP.net ,我觉得是不可能的,MS苦心经营了几年的东西,一下子就这样抛弃了?不可能

我想MS的MVC是一种让程序员的多项选择吧,而且这个框架还没有看到预览版本,一切都是未知数

至于楼主的框架,我觉得思路很不错,也很清晰,期待中
2007-10-11 19:57 | 代码乱了      

#26楼    回复  引用  查看    

mvc取代webform?又有多少人知道webform是mvc的一种,只是常说的mvc是Front Controller而webform是page controller.
从性能上来说Front Controller根本没有绝对优胜于page controller,过多的服务控件堆积导致ViewState处理损耗过大,但没有ViewState一样存在数据保存问题(缓存或数据重新获取)那方面做得不好都直接影响性能.
2007-10-11 21:35 | henry      

#27楼    回复  引用    

微软的.net技术在开发并发量很大的应用程序上一直口碑不好,任何事物有好的一面必然有坏的一面。要提高asp.net应用程序性能需要下一番功夫,但是asp.net 开发速度相对快的优点也是显而易见的,WEB服务器存在即合理,向页面上拖一个gridview,sqldatasource,一行代码都不要写就可以完成数据修改、删除、增加,java中恐怕没有这么简单吧?
什么东西都要讲究快,如果不是对系统性能要求特别高,我相信asp.net还是第一选择。
远离加班,关注健康,多陪陪家人,这比什么都好
2007-10-11 23:21 | 9527 [未注册用户]

#28楼    回复  引用  查看    

mark
2007-10-12 13:10 | 丹心猪(Dansinge)      

#29楼    回复  引用    

不适合就要改,比较认同在MVC中放弃控件的思想.
2007-10-12 13:30 | 小鬼00 [未注册用户]

#30楼    回复  引用    

不知道楼主的ASP.NET MVC是指哪个产品呢?能给个链接不?
2007-10-12 13:43 | 小鬼00 [未注册用户]

#31楼    回复  引用    

比起velocity来说还是太繁琐了
2007-10-12 19:37 | yzl [未注册用户]

#32楼    回复  引用  查看    

@henry
似乎PageController是FrontController的一种, WebForm不是MVC, FrontController和MVC是两种方式. MSDN有这个的介绍~~

@kiler
Google的Orkut.com, MySpace.com, 微软旗下的几个网站. 都是全球排名高于sina之类的. 也没咋地, 视图状态也不是说非要用或者非要不用啊..., ViewState滥用本来就有问题, 用的恰当, 难道比还会更糟糕么? 事件回发机制也能省很多事, 感觉不能太绝对..
2007-10-13 14:03 | 怪怪      

#33楼    回复  引用  查看    

另外, LZ的思路和我现在做的一个东西有点象, 不过我那个东西走的更远, 而且也已经运转了, 有空交流一下?
2007-10-13 14:04 | 怪怪      

#34楼    回复  引用  查看    

@怪怪

http://www.microsoft.com/china/MSDN/library/architecture/patterns/esp/DesPageController.mspx?mfr=true

http://www.microsoft.com/china/MSDN/library/architecture/patterns/esp/DesFrontController.mspx?mfr=true
2007-10-14 17:30 | henry      

标题  
姓名  
主页
Email (只有博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2007-10-11 14:23 编辑过
 
另存  打印