你的位置:首页 > ASP.net教程

[ASP.net教程]Asp.net自制模板框架

最近在做个包含了大量重复样式的控件的网站.

如果用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现成框架都有,而且更强大的多.

玩玩的话是不错,应用到实际项目中还是要慎重考虑.