最近在做一个系统,系统中有一个功能就是用浏览器打印已经配置好的Word文档到本地,这个功能,其实挺简单的,也很好实现。当时我们是用FireFox做的测试,非常简单就实现了。打印效果如下:
在测试兼容性的时候,我们用IE测试出现了问题(其他浏览器基本上兼容),文档名称出现了乱码,如下图所示
出现问题之后,我查了一些资料,发现原来是IE浏览器与需要对中文名称进行编码,然后再显示,就可以了。我们的源代码如下:
public void jianxigongzi(FileWagesViewModel enFileWages)
{
if (Session["userID"]==null) {
RedirectToAction("../Login/Login");
}
//获取模板的路径
var path = Server.MapPath("../Document/1见习工资审批表.doc");
#region 给见习工资审批表的各个参数赋值
string strUserID = Session["userID"].ToString();
//string strUserID = "001";//写死的测试
while (strUserID.Length < 4)
{
strUserID = "0" + strUserID;
}
//获取信函编号
string strCardNo = numberInfo.GetNumber();
while (strCardNo.Length < 4)
{
strCardNo = "0" + strCardNo;
}
string basicInformationNumber = enFileWages.basicInformationNumber;
//获取documentID参数
string number = "LFRC" + strUserID + "No." + strCardNo;
//给word中的表赋值
string name = enFileWages.name;//姓名
string sex = enFileWages.sex;//性别
//调用B层获得出生日期
//FileWagesViewModel resShow = fileWagesInfo.QueryBasicInfo(basicInformationNumber);
List<BasicInfoViewModel> ShowDetileInfores = resBasicres.ShowdetailBasicInfoLetter(basicInformationNumber).ToList();
BasicInfoViewModel resShow = ShowDetileInfores.FirstOrDefault();
string birthday = resShow.birthday == null ? "" : string.Format("{0:D}", Convert.ToDateTime(resShow.birthday));//出生年月
//调用学历中的方法,获得其他的三个字段
//获得学历表中的信息
StudentStatusInfoViewModel enStudentInfo = queryStudentStatus.QueryDetailStudent(basicInformationNumber);
string enter = enStudentInfo.entranceDate == null ? "" : string.Format("{0:D}", Convert.ToDateTime(enStudentInfo.entranceDate));//入学时间
string graduate = enStudentInfo.graduationDate == null ? "" : string.Format("{0:D}", Convert.ToDateTime(enStudentInfo.graduationDate));//毕业时间
string back = enStudentInfo.educationBackground;//学历
string parttime = resShow.workingtime == null ? "" : string.Format("{0:D}", Convert.ToDateTime(resShow.workingtime)); //参加工作的时间
string fileName = "见习工资审批表.doc";//这是文件名,如果不进行编码,直接放在这里,IE就会乱码
string letterType = "见习工资审批表";
string userId = Session["userID"].ToString();
string letterNum = strCardNo;
//获取模板中设定好的字段
String[] fieldNames = new String[] { "number", "name", "sex", "enter", "graduate", "back", "birthday", "parttime" };
//给模版中参数赋值
Object[] fieldValues = new Object[] { number, name, sex, enter, graduate, back, birthday, parttime };
Print(path, fileName, fieldNames, fieldValues);
filterPrint.FilterPrint(basicInformationNumber, letterType, letterNum, userId);
#endregion
}
查到问题之后,我们进行了修改,在打印之前,先判断浏览器,如果是IE , 就对filename进行UTF-8的编码,然后再输出,如果不是,就直接输出,这样问题就解决了。修改代码如下:
string fileName=<span style="font-family: Arial, Helvetica, sans-serif;">"户号6665.doc"</span><span style="font-family: Arial, Helvetica, sans-serif;">;</span>
string UserAgent = Request.ServerVariables["http_user_agent"].ToLower();
if (UserAgent.IndexOf("firefox") == -1) //如果不是火狐浏览器
{
fileName = HttpUtility.UrlEncode(<span style="font-family: Arial, Helvetica, sans-serif;">fileName</span><span style="font-family: Arial, Helvetica, sans-serif;">, Encoding.UTF8);</span>
}
如此一来,就达到了浏览器兼容。