zoukankan      html  css  js  c++  java
  • ASP.NET 一般处理程序基础2(Nvelocity模板引擎用法)

    Person person = new Person();
    person.Name = "yzk";
    person.Age = 30;

    Person dad = new Person();
    dad.Name = "ywx";
    dad.Age = 60;
    person.Father = dad;
    在html模板中可以这样取值<p>我的老爹是 $p.Father.Name,他的年龄是$p.Father.Age </p>


    19、Nvelocity的特性,如果建立的对象是个索引,还可以把索引当做它的值。
    Dictionary<string,string> dict=new Dictionary<string,string>();//建一个Dictionary键值对
    dict["tom"]="斯坦福";
    dict["jim"]="加里敦";
    dict["yzk"]="哈佛"; //把Dictionary扔给模板引擎

    VelocityEngin vltEngine=new VelocityEngine();
    vltEngine.SetProperty(RuntimeConstants.RESOURCE_LOADER,"file");
    vltEngine.SetProperty(RuntimeConstants.FILE_RESOURCE_LOADER_PATH,System,Web.Hosting.HostingEnvironment.MapPath("~/templates"));
    vltEngine.Init();
    VelocityContext vltContext=new VelocityContext();
    vltContext.Put("ps",dict);//这里改成使用字典
    Template vltTemplate=vltEngine.GetTemplates("test3.htm");
    System.IO.StringWriter.vltWriter=new System.IO.StringWriter();
    vltTemplate.Merge(vltContext,vltWriter);//用GastleNvelocity1.11版本的就不会报错了
    
    string html=vltWriter.GetStringBuilder().ToString();
    context.Response.Write(html);

    --------------------------------test3.htm
    <p>$ps.tom;</p> 可以得到斯坦福

    20、Nvelocity的深入,可以对对象进行foreach
    C#基本语法
    string[] strs=new string[]{"dsdsds",sresfs"};
    foreach(string s in strs)
    {
    Console.WriteLine(s);
    }
    -------------------------------可以类似于这样的遍历
    string[] strs=new string[]{"黄继光","古天乐","张靓颖"};
    vltContext.Put("mingrens",strs);
    -----------------------------------------------
    List<Person> persons=new List<Person>();//用前面定义好的那个Person类
    persons.Add(new Person{Age=30,Name="林华丽"});
    persons.Add(new Person{Age=10,Name="王二小"});
    persons.Add(new Person{Age=20,Name="刘德华"});
    vltContext.Put("psersons",persons);
    ...........................
    -------------------------test3.htm里面
    <body>
    #foreach($mr in $mingrens)
    <li>$mr</li>
    #end
    </body> //这就是对集合进行遍历然后输出的方法
    ----------------------------------------------------------
    <body>
    #foreach($mr in $mingrens)
    <li>$p.Name的年龄是$p.Age</li>
    #end
    </body> //这就是对集合进行遍历然后输出的方法


    21、可以在NVelocity中用if else判断
    #if($age>10)
    大于10
    #else
    小于10
    #end
    ----------------------------------
    <ul>
    #foreach($p in $persons)
    #if($p.Age>20)
    <li style="color:Red">$p.Name的年龄是$p.Age</li>
    #else
    <li style="color:Green">$p.Name的年龄是$p.Age</li>
    #end
    #end
    </ul>


    22、Nvelocity的包含,类似于母版页,所有的页面中都调用这个,包含头尾,和母版一样用。
    --------------------------------head.htm

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <title></title>
    </head>
    <body>
    <p><h1>欢迎光临$age</h1></p>
    #if($age>30)
    hahaha
    #end

    -------------------------------foot.htm

    #if($age<10)
    hahaha
    #end
    <p>本网站版权所有$age</p>
    </body>
    </html>

    -------------------------------test3.htm
    #include("head.htm");
    ....................
    #include("foot.htm");
    -------------------------------guanggao.htm可以加个广告,不光是头尾
    <a href="http://www.baidu.com">点击加载
    #include("guanggao.htm");
    ************************************************************************************
    除了include还有个叫parse可以将include替换掉,作用和效果是一样的,但是有区别。
    include元素只是把页面内容包含进来,并不会解析其中的Nvelocity元素,而parse会解析其中的元素
    也就是说早head.htm或者foot.htm中加入$p.name不会include不会解析,parse会解析

    23、对Nvelocity进行封装
    用C#中提供的匿名类来解决这个问题
    ----------------------------------------displayNews.htm
    <body>
    <h1>$title</h1>
    <p>作者:$author;发布日期:$postdate</p>
    <p>$msg</p>
    </body>
    ---------------------------------------DisplayNews.ashx
    vltContext.Put("title","sfdsds");
    vltContext.Put("author","sfdsds");
    vltContext.Put("person","sfdsds");
    vltContext.Put("age","sfdsds");//这样要put四个变量
    ******************************************怎么解决
    <body>
    <h1>$data.Title</h1>
    <p>作者:$data.Tuthor;发布日期:$data.Tostdate</p>
    <p>$data.Msg</p>
    </body>
    -----------------------------------定义匿名类//所谓的匿名类其实就是编译器自动帮你生成的一
    个类,其实还是一个正常的类
    var news=new{Tile="特大喜讯",Author="刘德华",PoseDate="2013-11-08",Msg="今晚上会公布喜讯
    细节!"};//把类的定义和对象的声明初始化放到一起
    string s=news.PostDate;//News是累的一个对象,一个类既然继承object那么直接可以点出来了
    匿名类的好处是,随new随用,用完就扔了
    vltContext.Put("data",news);//把匿名类的对象放进去

    public void ProcessRequest(HttpContext context)
    {
        context.Response.ContentType = "text/html";
        VelocityEngine vltEngine = new VelocityEngine();
        vltEngine.SetProperty(RuntimeConstants.RESOURCE_LOADER, "file");
        vltEngine.SetProperty(RuntimeConstants.FILE_RESOURCE_LOADER_PATH,System.Web.Hosting.HostingEnvironment.MapPath("~/templates"));
    //模板文件所在的文件夹 vltEngine.Init(); //把类的定义和对象的声明初始化放到一起 //匿名类 var news = new { Title = "特大喜讯",Author="杨中科",PostDate="2013-11-08",Msg="今天晚上会公布喜讯细节!" }; string s = news.PostDate; VelocityContext vltContext = new VelocityContext(); vltContext.Put("data", news); Template vltTemplate = vltEngine.GetTemplate("displayNews1.htm"); System.IO.StringWriter vltWriter = new System.IO.StringWriter(); vltTemplate.Merge(vltContext, vltWriter); string html = vltWriter.GetStringBuilder().ToString(); context.Response.Write(html); }

    也可以定义一个Nvelocity类简化代码:

            public static string RenderHtml(string name, object data)
            {
                VelocityEngine vltEngine = new VelocityEngine();
                vltEngine.SetProperty(RuntimeConstants.RESOURCE_LOADER, "file");
                vltEngine.SetProperty(RuntimeConstants.FILE_RESOURCE_LOADER_PATH, System.Web.Hosting.HostingEnvironment.MapPath("~/templates"));//模板文件所在的文件夹
                vltEngine.Init();
    
                VelocityContext vltContext = new VelocityContext();
                vltContext.Put("Model", data);//设置参数,在模板中可以通过$data来引用
    
                Template vltTemplate = vltEngine.GetTemplate(name);
                System.IO.StringWriter vltWriter = new System.IO.StringWriter();
                vltTemplate.Merge(vltContext, vltWriter);
                return vltWriter.GetStringBuilder().ToString();
            }
  • 相关阅读:
    BZOJ 3158: 千钧一发
    BZOJ 1677: [Usaco2005 Jan]Sumsets 求和
    BZOJ 1574: [Usaco2009 Jan]地震损坏Damage
    BZOJ 1644: [Usaco2007 Oct]Obstacle Course 障碍训练课
    BZOJ 1715: [Usaco2006 Dec]Wormholes 虫洞
    BZOJ 1634: [Usaco2007 Jan]Protecting the Flowers 护花
    Vijos P1740聪明的质检员
    Vijos P1680距离
    Vijos P1067Warcraft III 守望者的烦恼
    BZOJ 1385: [Baltic2000]Division expression
  • 原文地址:https://www.cnblogs.com/d685600/p/3647271.html
Copyright © 2011-2022 走看看