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();
}
}
}
根据上面的代码从模板解析后的页面代码,我更新了演示代码,你可以点击查看