标签:
最近在做个包含了大量重复样式的控件的网站.
如果用MVC的话,我可以针对每个需要单独块编辑的Model写一个局部视图.
然后根据不同逻辑需求拼起来.用现成MVC框架非常容易做到.
但环境是3.5的最高只能用MVC2,没有razor语法,加上没装开发环境.
于是想干脆自己写一个模板生成HTML的框架,一开始也报了点好玩的想法.
但做到后面就觉得,和MVC比起来功能太弱,但自由度很高,想什么样功能都不受限制.
主要代码并不多.
我用json数据来保存视图配置,反序列化得到实例,然后根据手动定义的视图配置+事先定义好的Html模板代码->生成最终html.
分成了几种类型:
page:页面
panel:面板
control:控件.
偷懒没有写各种控件类,所有属性放这个类里,目前功能不多还好,如果扩展越多就比较乱了.
Html模板代码类似这样:用{属性名}来替换数据.
<div class="item"><span class="iname"><i>{require}</i>{label}</span>
<input id="{name}" name="{name}" placeholder="{placeholder}" text="{label}"
onblur="" maxlength="{maxlength}" type="text"></div>
Json数据类似这样:(后来写了一个自动生成基础json数据的工具,生成默认配置的json数据)
{ "label":"标题", "name":"Basic", "controls":[ { "name":"id_type", "label":"证件类型", "type":"combox", "column":"BusinessIDCardInfo", "valid":"checkNull" }, "panels":[ ] }
最后在aspx页面调用组合各个page.支持多个页面跳转的功能.check2是由跳转按钮触发,每个页面一个跳转函数,函数内,先执行框架内置检测函数checkfunc也是每个page一个.
最后调用next2(),也是框架内置的跳转函数,根据当前页数决定是跳转还是提交.
<asp:Content ID="Content1" ContentPlaceHolderID="content" Runat="Server"> <input type="hidden" name="pbtype" value="p" /> <%=WechatPrefill.Manager.GetHtml("pBasic",1,2,"新的标题") %> <%=WechatPrefill.Manager.GetHtml("pEbank",2,2) %> <script>
function check2() {
function check2() {
if (!checkfunc2()) return;
next2();
}
</script>
功能类其实很少,本人写代码习惯是写少一点.
贴一下主要功能代码:
根据反射obj的属性,根据名字替换模板中指定文本.
这里除了string,int还有Dictionary类型需要特别处理.
所有模板替换都在这一个函数里完成.
public static string GetHtml(string tempHtml,object obj) { var t = obj.GetType(); foreach (var field in t.GetFields()) { var value=field.GetValue(obj); if (value == null) { tempHtml = tempHtml.Replace("{" + field.Name + "}", ""); continue; } ..... }
这是Panel类,先替换标题文本,获取panel的模板数据,反射替换模板.
public class Panel : Itemplate { public string name; public string label; public string img; public List<Control> controls; public string Html() { label = Manager.GetLabel(label); var temp = Template.GetTemplate("panel"); return Template.GetHtml(temp, this); } }
最后还有生成数据方面.
因为已经用了反射比较影响效率,本来不想用递归,不过由于属性的层级可能很深(可能是A.b.C.D.E.property)所以,如果完全用循环,代码要写很长.
还是递归比较简单.
最后其实我想说,后悔这么做了.
因为太麻烦了,这些功能MVC现成框架都有,而且更强大的多.
玩玩的话是不错,应用到实际项目中还是要慎重考虑.
标签:
原文地址:http://www.cnblogs.com/niconico/p/5202545.html