进公司第一个任务就是在siteserver上增加问卷调查。主要原因是siteserver自带的投票功能比较单一每个投票是一个问题。其中还有个bug,就是当投票选项达到50以上就出现问题。因此需要进行问卷调查可以理解是一个调查下多个投票。数据库设计什么的就不说了。这里主要是说下如何将问卷支持添加到siteserver的模板中生成静态页面。
思路如下:
1、后台Vote.aspx主要功能根据voteid绑定问卷的题目答案以及进行提交和查看结果处理。首先重写Vote.aspx的Render事件。让每次请求Vote.aspx的时候生成对应的html文件,如Votetemplate_43.htm。这里面不能有<head>之类的。
参考代码:
protected override void Render(HtmlTextWriter writer)
{
StringWriter html = new StringWriter();
System.Web.UI.HtmlTextWriter tw = new System.Web.UI.HtmlTextWriter(html);
base.Render(tw);
StreamWriter sw;
string path = Server.MapPath("Vote") + "template_" + titleid + ".htm";
sw = new StreamWriter(path, false, System.Text.Encoding.UTF8);
int findex = html.ToString().IndexOf("<form");
int lindex = html.ToString().IndexOf("</form>");
sw.Write(html.ToString().Substring(findex, lindex - findex + 7));
sw.Close();
tw.Close();
Response.Write(html.ToString());
}
这样就生成了表单这类的所有问卷信息。说明下,我这的问卷绑定是通过在表单中的PlaceHolder1动态添加单选、多选、问答等情况的。
2、通过ajax调用上面生成的页面。
function get(num)
{
var http = GetXmlHttp();
var url;
url = "Votetemplate_"+num+".htm";
http.open("GET", url, true);
http.onreadystatechange = function()
{
if (http.readyState == 4 && http.status ==200)
{
var text;
text = bytes2BSTR(http.responseBody);
document.getElementById("HtmlDiv").innerHTML =text;
}
}
http.send(null);
}
function GetXmlHttp()
{
var C = null;
try
{
C = new ActiveXObject("Msxml2.XMLHTTP");
}
catch(e)
{
try
{
C = new ActiveXObject("Microsoft.XMLHTTP");
}
catch(sc)
{
C = null;
}
}
if( !C && typeof XMLHttpRequest != "undefined" )
{
C = new XMLHttpRequest();
}
return C;
}
直接在模板中写上:
<script type="text/javascript" src="readhtml.js"></script>
<div id="HtmlDiv"></div>
然后在onload中调用Test(id)即可
原本的思路是在GetXmlHttp()中动态添加<div id="HtmlDiv"></div>省去在模板中写的,后来发现不行。还有onload中的Test原来打算写在readhtml.js中的。不是要考虑传入参数嘛。我想到了每次生成调用js的时候修改js文件也就是修改num占位符。不过后来被否定,因为那样I/O操作将很频繁,没有必要。
3、大家可能看到了bytes2BSTR函数没错,用它是为了解决乱码的。网上解决通过因为ajax异步输出文字的时候出来乱码。在这就不做说明了。
最后说明:可能有人看到这里觉得用ajax去调用html文件有必要吗?直接用js将html中的内容读入就不行了。我也说过,不过因为是js操作文件必须设置IE中的安全。(IE6.0中)希望对大家有用吧。