nvelocity中的#if()如何在JavaScript中使用?

nvelocity中的if跟JavaScript中的if关键字冲突了,怎么想办法可以用nvelocity中的#if

 <script type="text/javascript">
     function GetTestType() {
         var s = document.getElementById("testType");
         $selectedType =s.options[s.selectedIndex].text;
         alert($selectedType);
         var n = document.getElementById("testName");

        #foreach($row in $Data.testData)
             #if($row.TestType==$selectedType)
                n.options.add(new Option("text", "value"));
               #end
         #end
     }
</script>

这个是按照你的改的:

 </head>
<script src="../javascript/jquery-1.7.2.js" type="text/javascript"></script>
 <script type="text/javascript">

     var testData = $Data.testData;
     function GetTestType() {

         var s = document.getElementById("testType");
         var n = document.getElementById("testName");
         var selectedType = s.options[s.selectedIndex].text;

         var i;
         for (i = n.length-1; i >=0; --i) {
             n.remove(i);  
         }
         alert(testData.length); //这个没反应。。。说明testData没有被赋值。
         for (i = 0; i < testData.length; ++i) {
             var row = testData[i];

             if (row.TestType == selectedType) {
                 n.options.add(new Option(row.TestName, row.Id));
             }
         }
  }
</script>

<script type="text/javascript">
    function GetSelectedId() {
        var s = document.getElementById("testName");
        $selectedId = s.options[s.selectedIndex].id
        alert($selectedId);

    }
</script>
<body>

图片说明

既然你是用了js,我认为你的testName这个下拉框的数据$Data.testData是一次性都传给客户端的,如果是这样的话,foreach, if等,都是纯js代码,不需要使用nvelocity的语句,需要的是把$Data.testData赋值给一个js变量,比如var testData = $Data.testData;
我写了一个简单的演示代码,你可以点击查看

 //var testData = $Data.testData;
var testData = [
    {TestType: 'Type 1', Text: 'Text 1', Value: 'Value 1'},
    {TestType: 'Type 2', Text: 'Text 2', Value: 'Value 2'},
    {TestType: 'Type 3', Text: 'Text 3', Value: 'Value 3'},
    {TestType: 'Type 1', Text: 'Text 4', Value: 'Value 4'},
    {TestType: 'Type 2', Text: 'Text 5', Value: 'Value 5'},
    {TestType: 'Type 3', Text: 'Text 6', Value: 'Value 6'},
    {TestType: 'Type 1', Text: 'Text 7', Value: 'Value 7'},
    {TestType: 'Type 2', Text: 'Text 8', Value: 'Value 8'}
];
function GetTestType(){
    var s = document.getElementById("testType");
    var selectedType = s.options[s.selectedIndex].text;
    //alert(selectedType);
    var n = document.getElementById("testName");

    var i;
    for (i = n.length - 1; i >= 0; --i) {
        n.remove(i);
    }
    //forEach(row in testData){
    for(i = 0, l = testData.length; i < l; ++i){
        var row = testData[i];
        if(row.TestType == selectedType){
            n.options.add(new Option(row.Text, row.Value));
        }
    }
}

nvelocity模板解析的时候,#if是作为一个整体的,应该不会有问题。你是提示出错还是没有解析出来?

#foreach($row in $Data.testData)这些语句是在服务器端解析后生成需要的内容,和js语法没关系吧。。只可能是这个框架导入的js脚本冲突什么的

首先,NVolecity是大小写敏感的,你在程序里面用的是小写的data,但是在模板里面用的是首字母大写的Data,这导致了模板找不到变量。
因为data.TestData是一个Data Row的集合,所以不能直接转换成模板里的数组,需要遍历一下,下面是更新的模板代码

<script src="../javascript/jquery-1.7.2.js" type="text/javascript"></script>
<script type="text/javascript">
    var testData = [];
    #foreach($item in $data.testData)
    testData.push({TestType: "$item.TestType", Id: "$item.Id", TestName: "$item.TestName"});
    #end
    function GetTestType() {
        var s = document.getElementById("testType");
        var n = document.getElementById("testName");
        var selectedType = s.options[s.selectedIndex].text;

        var i;
        for (i = n.length-1; i >=0; --i) {
            n.remove(i);  
        }
        alert(testData.length); //这个没反应。。。说明testData没有被赋值。
        for (i = 0; i < testData.length; ++i) {
            var row = testData[i];

            if (row.TestType == selectedType) {
                n.options.add(new Option(row.TestName, row.Id));
            }
        }
    }
</script>

<script type="text/javascript">
    function GetSelectedId() {
        var s = document.getElementById("testName");
        $selectedId = s.options[s.selectedIndex].id
        alert($selectedId);
    }
</script>

下面是根据你的描述我写的解析模板的测试程序

using System;
using Commons.Collections;
using System.IO;
using System.Data;
using NVelocity;
using NVelocity.App;
using NVelocity.Runtime;

namespace NVelocityDemo
{
    class Program
    {
        public static void Main(string[] args)
        {
            Render();
            Console.Write("Press any key to continue . . . ");
            Console.ReadKey(true);
        }

        public static DataTable CreateData()
        {
            DataTable userTable = new DataTable();
            userTable.Columns.Add("TestType", typeof(string));
            userTable.Columns.Add("Id", typeof(int));
            userTable.Columns.Add("TestName", typeof(string));
            userTable.Rows.Add("Type 1", 1, "Name 1");
            userTable.Rows.Add("Type 2", 2, "Name 2");
            userTable.Rows.Add("Type 3", 3, "Name 3");
            userTable.Rows.Add("Type 1", 4, "Name 4");
            userTable.Rows.Add("Type 2", 5, "Name 5");
            userTable.Rows.Add("Type 3", 6, "Name 6");
            userTable.Rows.Add("Type 1", 7, "Name 7");
            userTable.Rows.Add("Type 2", 8, "Name 8");
            userTable.Rows.Add("Type 3", 9, "Name 9");
            return userTable;
        }

        public static void Render()
        {
            var data = new {testData = CreateData().Rows};

            VelocityEngine ve = new VelocityEngine();//模板引擎实例化
            ExtendedProperties ep = new ExtendedProperties();//模板引擎参数实例化
            ep.AddProperty(RuntimeConstants.RESOURCE_LOADER, "file");//指定资源的加载类型
            ep.AddProperty(RuntimeConstants.FILE_RESOURCE_LOADER_PATH, AppDomain.CurrentDomain.BaseDirectory);//指定资源的加载路径
            ep.AddProperty(RuntimeConstants.INPUT_ENCODING, "utf-8");//输入格式
            ep.AddProperty(RuntimeConstants.OUTPUT_ENCODING, "utf-8");//输出格式
            //模板的缓存设置
            //ep.AddProperty(RuntimeConstants.FILE_RESOURCE_LOADER_CACHE, true);              //是否缓存
            //ep.AddProperty("file.resource.loader.modificationCheckInterval", (Int64)300);    //缓存时间(秒)
            ve.Init(ep);

            Template t = ve.GetTemplate("StudentExam.htm");//加载模板
            VelocityContext vc = new VelocityContext(); //当前的数据信息载体集合
            vc.Put("data", data);//输入data标签的数据,模板标签为$data       

            StringWriter sw = new StringWriter();
            t.Merge(vc, sw);

            Console.Write(sw.ToString());
            //System.Diagnostics.Debug.Print(sw.ToString());

            Console.ReadLine();
        }
    }
}

根据上面的代码从模板解析后的页面代码,我更新了演示代码,你可以点击查看