Asp.net自制模板框架

时间:2022-06-11 15:14:32

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

如果用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是由跳转按钮触发,每个Page对象一个跳转函数,该函数内,先执行框架内置验证函数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>

功能类其实很少,本人写代码习惯是写少一点.

Asp.net自制模板框架

贴一下主要功能代码:

根据反射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)所以,如果完全用循环,代码要写很长.

还是递归比较简单.

Asp.net自制模板框架

 

最后其实我想说,后悔这么做了.

因为太麻烦了,这些功能MVC现成框架都有,而且更强大的多.

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