GridView中更新事件后的无限循环

本文关键字:无限循环 事件 更新 GridView | 更新日期: 2023-09-27 17:51:08

我正面临一个很奇怪的问题,不知道该怎么说。但我会尽我最大的努力。

我有一个网格视图,其中包括文件上传控制和文件存储在数据库时,更新事件被调用。文件上传代码被编写为一个函数,它在点击更新按钮时被调用。

现在一切都很好,就像当我点击更新,文件在数据库中得到更新,但页面进入无限循环,似乎有些东西正在处理。过了一段时间,一个对话框出现在其中,我得到一个选项下载整个网页的格式文件上传(不知道为什么,这个对话框是如何出现的),但仍然是在循环和正在处理的页面。我已经检查了我的代码像几百次,但仍然无法找到问题。

欢迎任何解决方案。提前谢谢。

上传文件代码

rotected void UploadDoc(object sender, EventArgs e)
    {
        int i = 0;
        foreach (GridViewRow row in GVTaskCompDept.Rows)
        {
            if ((row.RowState & DataControlRowState.Edit) > 0)
            {
                FileUpload FU = (FileUpload)GVTaskCompDept.Rows[i].Cells[8].FindControl("FileUpload1");
                string filePath = FU.PostedFile.FileName;
                string filename = Path.GetFileName(filePath);
                if (filePath != null && filePath != "")
                {
                    FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read);
                    BinaryReader br = new BinaryReader(fs);
                    Byte[] bytes = br.ReadBytes((Int32)fs.Length);
                    br.Close();
                    fs.Close();
                    string ext = System.IO.Path.GetExtension(FU.FileName).TrimStart(".".ToCharArray()).ToLower();
                    string name = System.IO.Path.GetFileName(FU.FileName);
                    // string ContentType = "";
                    if (ext == "doc" || ext == "docx")
                        ContentType = "application/vnd.ms-word";
                    else if (ext == "xlx" || ext == "xlsx" || ext == "xls")
                        ContentType = "application/vnd.ms-excel";
                    else if (ext == "jpeg" || ext == "jpeg")
                        ContentType = "image/jpeg";
                    else if (ext == "pdf")
                        ContentType = "application/pdf";
                    (Session)["Data"] = bytes;
                    (Session)["Name"] = name;
                    (Session)["Type"] = ContentType;
                }
                else
                {
                    (Session)["Data"] = null;
                    (Session)["Name"] = null;
                    (Session)["Type"] = null;
                }
            }
            i += 1;
        }
    }

RowUpdating Event类似

 protected void GVTaskCompDept_RowUpdating(object sender, GridViewUpdateEventArgs e)
    {          
            GridViewRow gvrow = GVTaskCompDept.Rows[e.RowIndex];
            Session["rowindex"] = e.RowIndex;
            UploadDoc(null, null);              
     //---Some Code-----//       
            {
                DSTaskCompliance.UpdateParameters["UploadDocTitle"].DefaultValue = (Session)["Name"].ToString();
                DSTaskCompliance.UpdateParameters["UploadDocType"].DefaultValue = (Session["Type"]).ToString();
            }
 //-------Some Code---------//
 DSTaskCompliance.Update();
            DSTaskCompliance.DataBind();            
    }

现在在DataSource Updating Event中,我将会话变量与其他部分代码一起传递,以将其更新到DB

protected void DSTaskCompliance_Updating(object sender, SqlDataSourceCommandEventArgs e)
    {
        e.Command.Parameters["@UploadDocContent"].Value = Session["Data"];
    } 

GridView中更新事件后的无限循环

这样的代码没有意义。无论如何,UploadDoc代码最有可能在以下行抛出异常:

FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read);

filePath是客户端路径(在非IE浏览器中仅为文件名),尝试在服务器上打开在生产场景中注定会失败。它可能在开发环境中工作,客户端/服务器都是同一台机器。

就您的具体问题而言,我怀疑是在页面的另一部分-您在页面内是否有任何代码试图显示/下载上传的文档?显然,您是否尝试过通过在visual studio等中设置断点来调试该问题

最后,我终于找到了解决问题的办法。这只是一个小错误。在上面的代码中,我指定了"ContentType"是特定的,当一个特定类型的文件被上传。例如:对于word文件,它是application/vnd.ms-word。

没有必要指定这个,因为我发现代码自己查找类型并在DB中存储相同的类型。我不需要。由于指定为应用程序,它总是倾向于以上传的格式下载文件。

非常感谢您的支持!!!!!:)