小鬼之家

流浪,游走于文明与原始之间. 关注底层技术,实现美好生活。QQ: 886988

  博客园 :: 首页 :: 联系 :: 订阅 订阅 :: 管理
  56 Posts :: 0 Stories :: 61 Comments :: 1 Trackbacks
        从一开始接触asp.net我就不领微软的情,对其提供和包装的各大控件给人们带来的方便性视而不见,一直想实现自己的模板分析方案,但工作中一直是别人安排我做什么我就得做什么,根本没时间做自己想做的事情,所以自己的模板方案迟迟未能实现。不过最近因为项目的需要,我终于有机会实现它了。

以下是我实现的模板文件Skin-test.html
{repeater rptTables}
    {headerTemplate}
        
<div id="miniBox">
            
<div class="hd">
                
<div class="l">1</div>
                
<div class="title">{repeater rptTables2}{headerTemplate}55555{/headerTemplate}{/repeater}</div>
                
<div class="r">3</div>
            
</div>
    {/headerTemplate}
    {itemTemplate}
            
<div class="it1">
                
<div class="l">
                    
<input id="{eval TableId}" type="checkbox" />
                    
<href="EditTable.aspx?tableid={eval TableId}">{eval TableName}</a>
                
</div>
                
<div class="r">
                    
<href="EditTable.aspx?tableid={eval TableId}">{lang Edit}</a>
                    
<href="EditTable.aspx?tableid={eval TableId}">{lang Delete}</a>
                
</div>
            
</div>
    {/itemTemplate}
    {alternatingItemTemplate}
            
<div class="it2">
                
<div class="l">
                    
<input id="{eval TableId}" type="checkbox" />
                    
<href="EditTable.aspx?tableid={eval TableId}">{eval TableName}</a>
                
</div>
                
<div class="r">
                    
<href="EditTable.aspx?tableid={eval TableId}">{lang Edit}</a>
                    
<href="EditTable.aspx?tableid={eval TableId}">{lang Delete}</a>
                
</div>
            
</div>
    {/alternatingItemTemplate}
    {footerTemplate}
            
<div class="ft">
                
<select id="Select1">
                    
<option value="">{lang Action}</option>
                    
<option value="">{lang Delete}</option>
                    
<option value="">{lang Build}</option>
                
</select>
            
</div>
            {repeater rptTables3}{headerTemplate}55555{/headerTemplate}{itemTemplate}{eval TableId}{/itemTemplate}{/repeater}
        
</div>
    {/footerTemplate}
{/repeater}

以下是分析这个模板的代码:
PageSetting p = ResourceManager.GetPageSetting(context.Request.CurrentExecutionFilePath);

                    
string txt = Skins.GetSkin(p.SkinFile);

                    IUI.ITemplate tmp 
= UIFactory.DataAccess.CreateTemplate();
                    tmp.InstantiateIn(
ref txt);

                    
if (tmp.ContainsKey("rptTables"))
                    
{
                        Repeater rpt 
= (Repeater)tmp.FindControl("rptTables");
                        Repeater rpt2 
= (Repeater)tmp.FindControl("rptTables2");
                        Repeater rpt3 
= (Repeater)tmp.FindControl("rptTables3");
                        List
<TableInfo> ls = new List<TableInfo>();

                        
for (int i = 0; i < 10; i++)
                        
{
                            TableInfo _tblInfo 
= new TableInfo();
                            _tblInfo.TableId 
= Guid.NewGuid();
                            _tblInfo.TableName 
= string.Format("table {0}", i);
                            ls.Add(_tblInfo);
                        }


                        rpt.DataSource 
= ls;
                        rpt.DataBind();
                        rpt2.DataSource 
= ls;
                        rpt2.DataBind();
                        rpt3.DataSource 
= ls;
                        rpt3.DataBind();
                    }


                    context.Response.Write(tmp.Render());

以下是执行的结果:

<div id="miniBox">
            
<div class="hd">
                
<div class="l">1</div>
                
<div class="title">55555</div>
                
<div class="r">3</div>
            
</div>
    
            
<div class="it1">
                
<div class="l">
                    
<input id="8f035f73-a025-4aaa-a9ab-9f6d475ee762" type="checkbox" />
                    
<href="EditTable.aspx?tableid=8f035f73-a025-4aaa-a9ab-9f6d475ee762">table 0</a>
                
</div>
                
<div class="r">
                    
<href="EditTable.aspx?tableid=8f035f73-a025-4aaa-a9ab-9f6d475ee762">edit</a>
                    
<href="EditTable.aspx?tableid=8f035f73-a025-4aaa-a9ab-9f6d475ee762">delete</a>
                
</div>
            
</div>
    
            
<div class="it1">
                
<div class="l">
                    
<input id="6571e446-7c50-48a7-8195-167cddab6966" type="checkbox" />
                    
<href="EditTable.aspx?tableid=6571e446-7c50-48a7-8195-167cddab6966">table 1</a>
                
</div>
                
<div class="r">
                    
<href="EditTable.aspx?tableid=6571e446-7c50-48a7-8195-167cddab6966">edit</a>
                    
<href="EditTable.aspx?tableid=6571e446-7c50-48a7-8195-167cddab6966">delete</a>
                
</div>
            
</div>
    
            
<div class="it1">
                
<div class="l">
                    
<input id="944a4cbc-3442-4d12-9c84-95f31d463e32" type="checkbox" />
                    
<href="EditTable.aspx?tableid=944a4cbc-3442-4d12-9c84-95f31d463e32">table 2</a>
                
</div>
                
<div class="r">
                    
<href="EditTable.aspx?tableid=944a4cbc-3442-4d12-9c84-95f31d463e32">edit</a>
                    
<href="EditTable.aspx?tableid=944a4cbc-3442-4d12-9c84-95f31d463e32">delete</a>
                
</div>
            
</div>
    
            
<div class="it1">
                
<div class="l">
                    
<input id="879b8f82-0d97-4c44-8996-9eb3ab676481" type="checkbox" />
                    
<href="EditTable.aspx?tableid=879b8f82-0d97-4c44-8996-9eb3ab676481">table 3</a>
                
</div>
                
<div class="r">
                    
<href="EditTable.aspx?tableid=879b8f82-0d97-4c44-8996-9eb3ab676481">edit</a>
                    
<href="EditTable.aspx?tableid=879b8f82-0d97-4c44-8996-9eb3ab676481">delete</a>
                
</div>
            
</div>
    
            
<div class="it1">
                
<div class="l">
                    
<input id="03452077-97b0-4236-b316-4856e3afde71" type="checkbox" />
                    
<href="EditTable.aspx?tableid=03452077-97b0-4236-b316-4856e3afde71">table 4</a>
                
</div>
                
<div class="r">
                    
<href="EditTable.aspx?tableid=03452077-97b0-4236-b316-4856e3afde71">edit</a>
                    
<href="EditTable.aspx?tableid=03452077-97b0-4236-b316-4856e3afde71">delete</a>
                
</div>
            
</div>
    
            
<div class="it1">
                
<div class="l">
                    
<input id="277c9626-1667-4f94-8e9a-b4f94d7e4843" type="checkbox" />
                    
<href="EditTable.aspx?tableid=277c9626-1667-4f94-8e9a-b4f94d7e4843">table 5</a>
                
</div>
                
<div class="r">
                    
<href="EditTable.aspx?tableid=277c9626-1667-4f94-8e9a-b4f94d7e4843">edit</a>
                    
<href="EditTable.aspx?tableid=277c9626-1667-4f94-8e9a-b4f94d7e4843">delete</a>
                
</div>
            
</div>
    
            
<div class="it1">
                
<div class="l">
                    
<input id="afe35db0-d07a-44fe-88be-db5ded717916" type="checkbox" />
                    
<href="EditTable.aspx?tableid=afe35db0-d07a-44fe-88be-db5ded717916">table 6</a>
                
</div>
                
<div class="r">
                    
<href="EditTable.aspx?tableid=afe35db0-d07a-44fe-88be-db5ded717916">edit</a>
                    
<href="EditTable.aspx?tableid=afe35db0-d07a-44fe-88be-db5ded717916">delete</a>
                
</div>
            
</div>
    
            
<div class="it1">
                
<div class="l">
                    
<input id="3a2f445e-44c4-4144-84da-b08e2fb90d3b" type="checkbox" />
                    
<href="EditTable.aspx?tableid=3a2f445e-44c4-4144-84da-b08e2fb90d3b">table 7</a>
                
</div>
                
<div class="r">
                    
<href="EditTable.aspx?tableid=3a2f445e-44c4-4144-84da-b08e2fb90d3b">edit</a>
                    
<href="EditTable.aspx?tableid=3a2f445e-44c4-4144-84da-b08e2fb90d3b">delete</a>
                
</div>
            
</div>
    
            
<div class="it1">
                
<div class="l">
                    
<input id="8d555e36-c4c7-4219-8f67-8305db9ae8d2" type="checkbox" />
                    
<href="EditTable.aspx?tableid=8d555e36-c4c7-4219-8f67-8305db9ae8d2">table 8</a>
                
</div>
                
<div class="r">
                    
<href="EditTable.aspx?tableid=8d555e36-c4c7-4219-8f67-8305db9ae8d2">edit</a>
                    
<href="EditTable.aspx?tableid=8d555e36-c4c7-4219-8f67-8305db9ae8d2">delete</a>
                
</div>
            
</div>
    
            
<div class="it1">
                
<div class="l">
                    
<input id="0edd6e3e-d1fc-4842-9832-d2e037f770ea" type="checkbox" />
                    
<href="EditTable.aspx?tableid=0edd6e3e-d1fc-4842-9832-d2e037f770ea">table 9</a>
                
</div>
                
<div class="r">
                    
<href="EditTable.aspx?tableid=0edd6e3e-d1fc-4842-9832-d2e037f770ea">edit</a>
                    
<href="EditTable.aspx?tableid=0edd6e3e-d1fc-4842-9832-d2e037f770ea">delete</a>
                
</div>
            
</div>
    
            
<div class="ft">
                
<select id="Select1">
                    
<option value="">action</option>
                    
<option value="">delete</option>
                    
<option value="">Build</option>
                
</select>
            
</div>
            555558f035f73-a025-4aaa-a9ab-9f6d475ee7626571e446-7c50-48a7-8195-167cddab6966944a4cbc-3442-4d12-9c84-95f31d463e32879b8f82-0d97-4c44-8996-9eb3ab67648103452077-97b0-4236-b316-4856e3afde71277c9626-1667-4f94-8e9a-b4f94d7e4843afe35db0-d07a-44fe-88be-db5ded7179163a2f445e-44c4-4144-84da-b08e2fb90d3b8d555e36-c4c7-4219-8f67-8305db9ae8d20edd6e3e-d1fc-4842-9832-d2e037f770ea
        
</div>


 

posted on 2007-08-23 22:16 黄志强 阅读(2557) 评论(25)  编辑 收藏 所属分类: 另类开发

Feedback

#1楼  2007-08-23 23:31 麦舒      
嗯,不错,不过要想成为一个成熟的模版解释器,不是件易事。
  回复  引用  查看    

#2楼 [楼主] 2007-08-23 23:35 黄志强      
@麦舒
我会根据项目的需要和实际开发过程的感悟不断地完善它的.
  回复  引用  查看    

#3楼  2007-08-24 00:12 kisskiki [未注册用户]
如果模版文件能动态生成就好了
  回复  引用    

#4楼  2007-08-24 01:04 deerchao      
What a great idea to replace <asp:Repeater id="rptTables" > with {repeater rptTables}!
  回复  引用  查看    

#5楼  2007-08-24 01:14 kwklover      
感觉不到有什么好处哦

UI和程序逻辑还是关联在一块,把<asp:Repeater id="rptTables" >替换成{repeater rptTables}有什么好处呢?或者解决了什么问题呢?看不明白。
  回复  引用  查看    

#6楼  2007-08-24 01:30 S.Sams      
好像跟 Repeater 没什么分别!
  回复  引用  查看    

#7楼  2007-08-24 01:48 sseo [未注册用户]
名茶
  回复  引用    

#8楼  2007-08-24 02:28 Moder [未注册用户]
不如discuz!nt的那种方式直接吧?
  回复  引用    

#9楼  2007-08-24 06:51 金色海洋(jyk)      
好玩?不好玩?
  回复  引用  查看    

#10楼  2007-08-24 07:47 补丁      
相比asp.net的控件和xslt,想不出哪里好呢?
  回复  引用  查看    

#11楼  2007-08-24 08:01 Share赖      
我参照PHP的smarty思想,做了一个相关的。
以下是显示模版,SQL语句写在XML中,用类方法读取这个SQL,得到DataTable,然后再传到替换方法中,主要用正则把<!!xxx!!>替换成DataTable中的DataRow值,再组成string值返回客户端。主要用好处就是随时更改模版页和SQL都不用重新编译,在显示数据上很灵活。

模版页:
<table>
<!for-tr-begin!>
<tr>
<!for-td-begin!>
<td>
<img src="Images/Mimages/listdot.gif" />&nbsp;&nbsp;<a href="ProductDetail.aspx?ID=<!!ProductID!!>"><!!ProductName!!></a></td>
<!for-td-end!>
</tr>
<!for-tr-end!>
</table>

  回复  引用  查看    

#12楼  2007-08-24 08:28 henry      
NVelocity在MonoRail上应用已经很成功了,楼主为何不试一下.
  回复  引用  查看    

#13楼  2007-08-24 08:30 BoyLee      
discuz!nt的不错.也可以考虑下开源的老外写的
  回复  引用  查看    

感觉楼主的思路还不是很清晰,没有通用性而且感觉就是为自己的项目用的
  回复  引用    

#15楼 [楼主] 2007-08-24 08:47