由于回发而变量不存储

时间:2014-02-19 10:39:19

标签: c# asp.net

我正在使用Upload Control FileUploadComplete事件将文档上传到临时文件夹,但我正在尝试监视临时文件夹中上传的内容,以便我可以在单击提交按钮时将其移动到真实的应用程序文件夹中。

我会上传我的代码;希望其中一些是有用的,谢谢

//global list to store temp uploads
protected List<string> listTempImages = new List<string>();

protected void Page_Load(object sender, EventArgs e)
{
    //.....
}

//upload to temp method
protected void ucUploadFile_FileUploadComplete(object sender, FileUploadCompleteEventArgs e)
{
    e.CallbackData = SavePostedFiles(e.UploadedFile);
} 

string SavePostedFiles(UploadedFile uploadedFile)
{
    if (!uploadedFile.IsValid)
    {
        return string.Empty;
    }
    string strAttachmentFolderQuery = "CALL storedProcedure"; //
    DataTable dtFolderLocation = new DataTable();
    BasicUtilities.SelectCommand(ref strAttachmentFolderQuery, ref dtFolderLocation, sqlConn, true);

    string strFolderLocation = @dtFolderLocation.Rows[0]["ColumnName"].ToString();
    string strCallFolder = strFolderLocation + @"Temp\\";

    /** File doesn't exists, create folder and copy in new file */

    listTempImages.AddRange(uploadedFile.FileName.Split('.'));
    string strFileName = listTempImages[0];

    FileInfo fi = new FileInfo(strFileName);
    String timeStamp;

    timeStamp = DateTime.Now.ToString("yyyMMddhhmmss");
    string fullFileName = MapPath(strFolderLocation) + fi.Name;
    ucUploadFile.SaveAs(strCallFolder + fi.Name + "_" + timeStamp + "." + listTempImages[1]);

    //file_name_uploadTimeStamp.extention
    string fileLabel = fi.Name;
    string fileLength = uploadedFile.FileContent.Length / 1024 + "k";
    /** adding image to temp to ensure you can get it or delete it  */
    listTempImages.Add(strCallFolder + fi.Name + "_" + timeStamp); 

    return string.Format("{0} ({1})|{2}", fileLabel, fileLength, fi.Name);
}


protected void btnSubmit_Click1(object sender, EventArgs e)
{
    if (listTempImages != null)
    {
        /** Upload attachment to server */
        while (listTempImages.Count >0)
        {
            Upload(callID, reporterID);
        }
    }
    else
    {
        /** Upload panel doesn't have have a file */
    }
}

**编辑

   <dx:ASPxButton ID="btnSubmit" runat="server" Text="Submit"
        ClientIDMode="AutoID"  
        onclick="btnSubmit_Click1" AutoPostBack="False">
        <ClientSideEvents Click="function(s, e) {
      if(document.getElementById('ucUploadFile_Input_0') == null){
    e.processonserver = false;
    $('#ucUploadFile_Add').click();
    e.processonserver = true;
       }
         }" />
   </dx:ASPxButton>

2 个答案:

答案 0 :(得分:2)

HTTP是无状态协议,并且在回发之间不保留全局变量。您可以在ViewState中存储需要保留在postback中的数据。如果数据不小,最好将其存储在某些持久性介质(如XML /数据库)中,以使ViewState尽可能小,因为它最终会添加到页面大小。

ViewState["listTempImages"] = listTempImages;

稍后通过ViewState

访问该对象
listTempImages = ViewState["listTempImages"] as List<string>;

无状态协议

  

在计算中,无状态协议是一种通信协议   将每个请求视为与之无关的独立事务   任何先前的请求,以便通信包括独立的   一对请求和响应。无状态协议不需要   服务器保留会话信息或每个的状态   通信伙伴在多个请求期间。在   相反,需要保持内部状态的协议是   称为有状态协议。要阅读更多关于国家的信息,请看这个   维基百科article

查看状态

  

视图状态是ASP.NET页面框架使用的方法   在往返之间保留页面和控制值。当HTML   呈现页面的标记,页面的当前状态和   在回发期间必须保留的值被序列化   base64编码的字符串。然后将此信息放入视图中   州隐藏字段,MSDN

答案 1 :(得分:1)

正如Adil所说,HTTP是无国籍的。每次请求进入服务器时,您都会获得一个刷新页面   如果viewstate没有完成您的工作,您可以将数据存储在会话中。但要避免在会话或视图状态中保存大量数据。如果您要存储大量数据,那么使用xml来存储数据。使用xml的好处是

  
      
  • 非常轻盈
  •   
  • 最快的旅行数据方法
  •   
  • 许可证独立
  •   

这里有一些国家管理的墨水 参考state management  和State Management in ASP.NET