使用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动态页面静态化之初始NVelocity模板引擎

Asp.net动态页面静态化之初始NVelocity模板引擎 静态页面是网页的代码都在页面中,不需要执行asp,php,jsp,.net等程序生成客户端网页代码的网页,静态页面网址中一般不含“?”、...

asp.net 非常简易的新闻发布系统,结合了ajax,json,Nvelocity模板引擎,只完成了一部分功能,非常适合新手看,我以前是学java方向的,刚接触.net,做的不好的别喷哈

asp.net 非常简易的新闻发布系统,简单运用了ajax,json,Nvelocity模板引擎,只完成了一部分功能,非常适合新手看,我以前是学java方向的,刚接触.net,以前也不懂ajax,js...

DotLiquid-Asp.net模板引擎

  • 2012-11-19 17:18
  • 122KB
  • 下载

asp.net超强模板引擎

  • 2011-02-15 16:48
  • 74KB
  • 下载

Net下模板引擎NVelocity的封装类――VelocityHelper

要求有网站模板功能,能够自主编辑网站的风格,因为这个系统是为政府部门做子站系统,举个例如:每个街道办拥有一个站点,而且可以设置他们的风格。 ASP.Net下的Skin技术可能能够实现这个功能的,不过我...

aspnetms. ASP.net模板引擎

  • 2009-07-02 10:35
  • 11KB
  • 下载

WebPart中使用Nvelocity模板引擎来进行呈现

NVelocity是一套强大的模板引擎,在我之前的随笔中,有过使用它来呈现页面及生成静态页的例子。通过使用它,我们可以达到界面与数据的完成分离(当然需要一些设计手段来支持)。我在公司里的工作主要就是在...

NVelocity模板引擎源码

  • 2010-04-20 20:51
  • 4.35MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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