使用NVelocity模板引擎构建ASP.NET网站

原创 2012年03月30日 16:33:19
    
    public interface IHandlerFactory
    {
        /// <summary>
        /// 页面加载
        /// </summary>
        /// <param name="context"></param>
        void Page_Load(ref VelocityContext context);


        /// <summary>
        /// 处理POST数据
        /// </summary>
        /// <param name="context"></param>
        void Page_PostBack(ref VelocityContext context);
    }

    /// <summary>
    /// NVelocity模板引擎成员类
    /// </summary>
    public class IHandler : IHttpHandler, IRequiresSessionState
    {
        /// <summary>
        /// MVC操作
        /// </summary>
        /// <param name="context"></param>
        public void ProcessRequest(HttpContext context)
        {
            string rootpath = context.Request.PhysicalApplicationPath;
            string scriptpath = context.Request.PhysicalPath;
            string filepath = scriptpath.Replace(rootpath, string.Empty);
            string filename = filepath.ToLower().Replace("/", ".").Replace("\\", ".").Replace(".aspx", string.Empty);
            string template = filename.Replace(".", "/") + ".html";  //获取当前请求页面所对应的html路径
            string templatepath = "template\\default"; //html页面所在的文件夹根路径
            string contentType = "text/html";

            string http_Accept = context.Request.ServerVariables["HTTP_ACCEPT"];
            VelocityEngine engine = new VelocityEngine();
            engine.SetProperty(RuntimeConstants.RESOURCE_LOADER, "file");
            engine.SetProperty(RuntimeConstants.FILE_RESOURCE_LOADER_PATH, rootpath + templatepath);  //设置引擎加载的文档所在的根路径
            engine.Init();
         
            VelocityContext ctx = new VelocityContext();
            string root = HttpContext.Current.Request.ApplicationPath;
            if (root == "/") root = string.Empty;
            ctx.Put("webpath", root);
            //保存页面处理时需要的相关变量
            IHandlerFactory factory = null;
            try
            {
                factory = (IHandlerFactory)Assembly.Load("xxxx").CreateInstance("xxxx" + filename, true);  //创建当前请求页面的实例
                if (factory == null)
                {
                    template = "error404.html";
                }
                else
                {

                    if (context.Request.HttpMethod == "POST" && !IsReSubmit(ref context, ref ctx))
                    {
                        factory.Page_PostBack(ref ctx);  //调用继承了该接口的请求页面的Page_PostBack方法

                    }
                    else
                    {
                        factory.Page_Load(ref ctx);  //调用继承了该接口的请求页面的Page_Load方法
                    }
                }
            }
            #region 异常
            catch (InvalidCastException ex)
            {   
                //异常处理,记录错误日志
                //template = "500.html";              
            }
            catch (Exception ex)
            {
                //异常出处理,记录错误日志   
            }
            #endregion
            //执行跳转的处理
            if (ctx.Get("redirecturl") != null)
            {
                string redirecturl = ctx.Get("redirecturl").ToString();
                context.Response.Redirect(redirecturl);
            }

            Template tpl = engine.GetTemplate(template);
            StringWriter writer = new StringWriter();
            tpl.Merge(ctx, writer);

            context.Response.ContentType = contentType;
            context.Response.Write(writer.GetStringBuilder().ToString());
        }
        /// <summary>
        /// 
        /// </summary>
        public bool IsReusable
        {
            get
            {
                return true;
            }
        }
        /// <summary>
        /// 是否重复提交
        /// </summary>
        /// <param name="context"></param>
        /// <param name="ctx"></param>
        /// <returns></returns>
        private bool IsReSubmit(ref HttpContext context, ref VelocityContext ctx)
        {
            //获取上次提交的令牌

            string token = context.Request.Cookies["token"] == null ? string.Empty : context.Request.Cookies["token"].Value;

            //为表单签名

            string newToken = Common.Input.MD5(context.Request.Form == null ? string.Empty : context.Request.Form.ToString());

            //和上次的令牌比较
            if (token != newToken)
            {
                context.Response.Cookies["token"].Value = newToken;
                return false;
            }
            ctx.Put("errors", "不允许重复提交数据");
            return true;
        }
    }


asp.net模板引擎:C#中Nvelocity的简单使用

Nvelocity简单使用示例。 把Nvelocity封装好的dll文件添加引用到你的项目中。 然后导入命名空间 1 2 3 usi...
  • qq752923276
  • qq752923276
  • 2014年09月23日 12:25
  • 1736

asp.net模板引擎:二、NVelocity标签语详解

NVelocity标签语详解,以及NVelocity调用说明 1. 变量   (1) 变量的定义:   1 2 3 4 5 6...
  • qq752923276
  • qq752923276
  • 2014年09月23日 12:23
  • 1730

asp.net模板引擎:一、NVelocity介绍

Velocity是什么 nVelocity能为我们作什么? 一、NVelocity介绍 1.1  Velocity是什么 nVelocity是一个基于.NET的模板引...
  • qq752923276
  • qq752923276
  • 2014年09月23日 12:15
  • 1756

模板引擎-NVelocity

Web开发的模板引擎是为了使界面、逻辑、数据分离,用它可以进行逻辑处理、数据填充,最终生成一个标准的HTML文档,然后以字符串形式返回给浏览器进行解析。模板引擎有很多种,这里介绍感觉使用很方便的NVe...
  • wang379275614
  • wang379275614
  • 2014年01月16日 22:01
  • 4022

NVelocity C#模板引擎

NVelocity是一个基于.NET的模板引擎(template engine)。它允许任何人仅仅简单的使用模板语言(template language)来引用由.NET代码定义的对象。从而使得界面设...
  • wujiaolong1
  • wujiaolong1
  • 2013年11月22日 08:56
  • 2089

不拖控件ASP.NET——NVelocity(1)

模板引擎(这里特指用于Web开发的模板引擎)是为了使用户界面与业务数据(内容)分离而产生的,它可以生成特定格式的文档,用于网站的模板引擎就会生成一个标准的HTML文档。今天我们主要来介绍NVeloci...
  • u010955843
  • u010955843
  • 2015年01月08日 20:12
  • 2484

NVelocity模板引擎用法之模板中直接调用类的方法

在多表存储同一对象相关信息时,如果要查询该对象的信息来自这多个表那么可以通过多表联合查询等等方案实现;但是,这种做法有一种缺点,每个表对应的model并不包含其他表中字段的定义,这样就使得多表联合查询...
  • wangzl1163
  • wangzl1163
  • 2016年01月15日 11:06
  • 706

小议ASP.NET模板引擎技术的使用

http://developer.51cto.com/art/200910/155190.htm 我们将从PHP模板引擎技术谈谈ASP.NET模板引擎技术,希望通过本文的实例和代码,能让大家...
  • mituan1234567
  • mituan1234567
  • 2014年07月07日 14:30
  • 510

asp.net 第六天 NVelocity模板初始化

NVelocity.App.VelocityEngine vltEngine = new NVelocity.App.VelocityEngine();             vltEngine.S...
  • suheonline
  • suheonline
  • 2013年12月08日 08:28
  • 549

Nvelocity模板引擎

Foreach 循环 == m 可以是任意值但是只能在foreach中使用,$为必须值,$!list为后台给的值  #foreach($m in $!list)  $!m.title  #end...
  • zlideren
  • zlideren
  • 2018年02月05日 17:01
  • 13
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:使用NVelocity模板引擎构建ASP.NET网站
举报原因:
原因补充:

(最多只允许输入30个字)