码迷,mamicode.com
首页 > Web开发 > 详细

Asp.net自制模板框架

时间:2016-02-20 01:49:02      阅读:295      评论:0      收藏:0      [点我收藏+]

标签:

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

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

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

Asp.net自制模板框架

标签:

原文地址:http://www.cnblogs.com/niconico/p/5202545.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!