none
IE8导致网站后台操作异常的问题 RRS feed

  • 常规讨论

  • 因为公司部署了WSUS,全部的电脑都从IE7更新为IE8,随后就发现了一些问题
    公司网站的后台管理界面是我在.NET 2.0环境上开发的,用C#语言,前台页面都还正常,后台很多页面不正常,
    经过仔细研究,发现不正常的页面都和DataGrid(或GridView)有关,且凡是和图片相关的处理功能,就会有问题
    异常情况如下——
    在执行Button1_Click或者OnItemCommand操作时,只要有图片处理的代码,程序执行完毕后,页面会变成一个白底的、全是该页面HTML代码的页面!!
    以上操作,程序的执行(即对数据库的操作)都正常,以前没升级客户端IE的时候都没问题,但是升级到IE8后,就会发生。


    下面我贴一个出问题的页面描述一下——

    这个页面最上面是2个输入框,代码如下:
    图片上传:<asp:fileupload runat="server" id="FileUpload1" Width="400px"></asp:fileupload>
    文字标题:<asp:TextBox ID="PicTitle" runat="server" Width="300px" MaxLength="200"></asp:TextBox>
    <asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="提交" />
    


    Button1_Click的代码如下:
    protected void Button1_Click(object sender, EventArgs e)
    {
        Label1.Text = "";
        if (FileUpload1.PostedFile.FileName != "")
        {
            string yyyyMM = DateTime.Now.ToString("yyyyMM");
            string StrSavePathRoot = "~/uploadfile/image/";
            string SavePath = Server.MapPath(StrSavePathRoot) + yyyyMM;
            if (!Directory.Exists(SavePath))
                Directory.CreateDirectory(SavePath);
    
            string ImgPath = FileUpload1.PostedFile.FileName;
            string exName = ImgPath.Substring(ImgPath.LastIndexOf(".") + 1).ToLower();//找出图片的后缀名
            string ImgName = DateTime.Now.ToString("ddHHmmssfff") + "." + exName;
            string ImgExtend = ImgPath.Substring(ImgPath.LastIndexOf(".") + 1);
            if (!(ImgExtend.ToLower() == "jpg" || ImgExtend.ToLower() == "jpeg"))
            {
                Label1.Text = "上传图片的格式不正确!必须是jpg格式的图片。";
                return;
            }
    
            FileUpload1.PostedFile.SaveAs(SavePath + "\\" + ImgName); //上传原始图片
            FileUpload1.Dispose();
    
            string ServerPath = StrSavePathRoot + yyyyMM + "/";
    
            //计算应该显示的大小尺寸
            System.Drawing.Image ImgSize = System.Drawing.Image.FromFile(Server.MapPath(ServerPath) + ImgName); //获取图片长宽   ****当上传了非图片格式的文件,会报错
            int ImgSizeWidth = 1200, ImgSizeHeight = 1200; //设定图片最大尺寸规则
            if (ImgSize.Width > ImgSizeWidth || ImgSize.Height > ImgSizeHeight)
            {
                Label1.Text = "上传图片的尺寸不符合规格!请修改大小!(长宽不得超过1200像素)";
                //删除照片,以免没用的数据占用空间
                ImgSize.Dispose();
                GC.Collect(); //强迫通用语言运行时进行启动垃圾收集线程进行回收工作
                string VirtualPath = StrSavePathRoot + ImgName + "." + ImgExtend.ToLower();
                System.IO.File.Delete(Server.MapPath(VirtualPath)); //删除图
                return;
            }
            else
            {
                GetThumbnailImage4(ServerPath, ImgName, ImgExtend.ToLower(), 75, 3); //先缩小到一个短边为75的略缩图,然后截取多余部分,取当中的小方图
            }
    
            string StrPicTitle = Request.Form["PicTitle"].Replace("'", "''");
    
            string strCon = System.Configuration.ConfigurationManager.AppSettings["ConnectionString1"];
            SqlConnection conn = new SqlConnection(strCon);
            //string id = DataGrid1.DataKeys[(int)e.Item.ItemIndex].ToString();
            SqlCommand comm = new SqlCommand("insert into PicList(PicName,PicTitle) values(@PicName,@PicTitle)", conn);
    
            SqlParameter parm2 = new SqlParameter("@PicName", SqlDbType.VarChar, 30);
            SqlParameter parm3 = new SqlParameter("@PicTitle", SqlDbType.VarChar, 200);
            parm2.Value = yyyyMM + "/" + ImgName;
            parm3.Value = this.PicTitle.Text;
            comm.Parameters.Add(parm2);
            comm.Parameters.Add(parm3);
    
            //判断输入框不能输入超长
            if (System.Text.Encoding.Default.GetBytes(parm3.Value.ToString()).Length <= 200)
            {
                conn.Open();
                comm.ExecuteNonQuery();
                conn.Close();
                DataListDataBind(); //写这句就会发生问题!!!!!!!!!!!!!!!
                //Response.Redirect("PicList.aspx"); //我以前一直是加这句解决的!!!!!
            }
            else
            {
                Label1.Text = "输入文字超过规定长度!";
            }
    
        }
        else
        {
            Label1.Text = "必须为作品上传图片!";
            return;
        }
    
    }
    


    protected void DataListDataBind()
    {
    SqlConnection conn = new SqlConnection(ConfigurationManager.AppSettings["ConnectionString1"]);
    SqlDataAdapter ad = new SqlDataAdapter("select * from PicList order by id desc", conn);
    DataSet dst = new DataSet();
    ad.Fill(dst, "Table1");
    conn.Open();
    this.DataGrid1.DataSource = dst.Tables["Table1"];
    this.DataGrid1.DataBind();
    conn.Close();
    }

    我最上面描述的那个DataGrid1_ItemCommand,功能是把当前表的几个数据字段读取出来,插入至另外一个表,字段中包括图片(先把当前图片另存为一份,然后在新图片上执行GetThumbnailImage4()的操作),图片处理的代码与Button1_Click中类似。问题出在也是comm.ExecuteNonQuery();完了后该绑定DataGrid的这步,DataListDataBind(); 就变成一个白底黑字的页面,内容全是当页的html。

    对于Button1_Click的问题,我把comm.ExecuteNonQuery();后的DataListDataBind();注释掉,改成Response.Redirect("xxxxList.aspx");页面才正常
    这个办法在Button1_Click事件里完全没有问题,因为在数据插入后,重新回到这个页面,新插入的数据永远都是在第一条显示
    但是在对LinkButton列操作DataGrid1_ItemCommand的时候就不行了,每次操作后都用Response.Redirect回到第一页,操作起来非常麻烦。
    希望各位大大能给一个有用的解决办法。

    注:网上我看有些人提的在页面中加<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7" /> ,我试过,对我说的这个不起作用。

    又注:在我发现是IE8的问题后,我从仓库里找了几台旧的还没升级过IE的电脑拿来测试,那些出问题的页面,在IE6和IE7下都没问题。

    2009年12月17日 4:36