2013-02-18 56 views
0

我有一個非常簡單的ASP.NET頁面上傳Excel工作簿,然後處理它。它使用AJAXFILEUPLOAD從ASP.NET AJAX的工具包...這裏的標記:簡單的ASP.NET文件上傳

<%@ Page Title="" Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup="true" 
CodeBehind="ImportWorkbook.aspx.cs" Inherits="Timesheet.ImportWorkbook" %> 

<asp:Content ID="Content1" runat="server" ContentPlaceHolderID="HeaderContentPlaceHolder"> 
<h1 class="topContent"> 
    Upload CPAS Timesheet Workbooks 
</h1> 
</asp:Content> 
<asp:Content ID="Content3" ContentPlaceHolderID="RightContentPlaceHolder" runat="server"> 
<br /> 
<br /> 
<asp:HiddenField ID="tbTSID" runat="server" /> 
<asp:HiddenField ID="tbWorkbookPath" runat="server" /> 
<ajaxToolkit:AjaxFileUpload ID="AjaxFileUpload1" runat="server" AllowedFileTypes="xls,xlsx,xlsm" 
    CssClass="dropdown" MaximumNumberOfFiles="1" OnUploadComplete="AjaxFileUpload1_UploadComplete" /> 
<br /> 
<br /> 
<asp:Panel ID="ProcessChoices" runat="server" > 
    <br /> 
    <br /> 
    <p> 
     Select how you want this workbook processed:</p> 
    <br /> 
    <asp:RadioButtonList ID="rbChoices" runat="server" BorderStyle="Groove" BorderWidth="2px" 
     BorderColor="Black" BackColor="Teal" Font-Names="Tahoma" Font-Size="10pt" ForeColor="White" 
     Width="40%"> 
     <asp:ListItem Value="True" Selected="True">&nbsp Replace ALL Items in the Timesheet</asp:ListItem> 
     <asp:ListItem Value="False">&nbsp Add Items from this Workbook to the Existing Timesheet Items</asp:ListItem> 
    </asp:RadioButtonList> 
    <br /> 
    <br /> 
    <asp:Button ID="btnValidate" runat="server" Text="Validate and Process" 
     BackColor="#B92217" ForeColor="White" BorderColor="#7C1810" 
     BorderStyle="Groove" Font-Names="Tahoma" onclick="btnValidate_Click" /> 
</asp:Panel> 
</asp:Content> 
<asp:Content ID="Content4" ContentPlaceHolderID="BottomSpanContentPlaceHolder" runat="server"> 
<asp:ScriptManager ID="ScriptManager1" runat="server"> 
</asp:ScriptManager> 
</asp:Content> 

母版頁和CSS的網頁是微不足道的,只有格式化。

這裏的隱藏代碼:

using System; 
using System.IO; 
using TimesheetUtilites; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls; 
using AjaxControlToolkit; 

    namespace Timesheet 
    { 

    public partial class ImportWorkbook : System.Web.UI.Page 
    { 
     private const string HDriveLocation= "H:\\mtv\\secure\\Construction\\Access\\CPAS WorkArea\\TimesheetUploads\\"; 
     private string strWorkbookPath;  
     private int currTSID; 

     protected void Page_Load(object sender, EventArgs e) 
     { 
      if (!IsPostBack) 
      { 
       if (Request.QueryString["ID"] != null) 
       { 
        tbTSID.Value = Request.QueryString["ID"];   // Storing the Timesheet ID in a hidden Textbox      
       } 
      } 
      else 
      { 
       if (!string.IsNullOrEmpty(tbWorkbookPath.Value)) 
       { 
        ProcessChoices.Enabled = true; 
       } 
      } 
      int.TryParse(tbTSID.Value, out currTSID); 
      strWorkbookPath = tbWorkbookPath.Value; 
     } 
     protected void AjaxFileUpload1_UploadComplete(object sender, AjaxFileUploadEventArgs e) 
     { 
      strWorkbookPath = HDriveLocation + Path.GetFileName(e.FileName); 
      tbWorkbookPath.Value = strWorkbookPath; 
      AjaxFileUpload1.SaveAs(strWorkbookPath); 
      ProcessChoices.Enabled = true; 
     } 

     protected void btnValidate_Click(object sender, EventArgs e) 
     { 
      bool processOption; 
      bool.TryParse(rbChoices.SelectedValue, out processOption); 
      strWorkbookPath = tbWorkbookPath.Value; 
      TimesheetUtilites.ImportTimesheet imp = new ImportTimesheet(currTSID, strWorkbookPath, processOption);  
     } 
    } 
} 

我的問題很簡單。雖然事件處理程序「AjaxFileUpload1_UploadComplete」工作正常,並上傳在瞬間的文件,當我火「btnValidate_Click」事件時,「tbWorkbookPath.Value」已成爲一個空字符串,而「ProcessChoices.Enabled」歡迎使用屬性不更改。不用說,「上傳完成」事件處理程序是我必須捕獲此文件路徑的唯一機會,所以我不知道我做錯了什麼。

我張貼在ASP.NET和去沒有答案。任何人都可以給我一個想法從哪裏開始?

+0

所以問題是隱藏字段值重置爲後空白之間的空白字符串。你有沒有試過把斷點放在哪裏以確定它的重置位置?嘗試在page_load中放置一個斷點,如果它不是回發。如果觸發你知道這是一個全新的要求,你就會有你的值存儲在自發布此 – 2013-02-18 17:32:21

+0

我已經試過幾件事情會話變量或東西... 1.我刪除了面板。有人在其他地方建議我與小組討論範圍問題......沒有快樂。 2.我將隱藏的字段會話狀態屬性更改爲false ...沒有喜悅...改回。 3.我將隱藏字段更改爲(非隱藏)文本框。在事件處理程序觸發之前和之後,文本框始終顯示爲空白。 – 2013-02-18 17:54:34

+0

那麼,將路徑存儲在會話變量中作爲下面的答案之一應該是非常有用的,但是看看值爲何會被擦除的位置/爲什麼會很有趣。 – 2013-02-18 17:57:55

回答

0

這是你應該在你的頁面的ViewState進行存儲,使其在頁面初始化回發並重置之間仍然存在信息。您的私人字符串成員更改爲類似如下:

private string strWorkbookPath { 
    get { 
     return this.ViewState["strWorkbookPath"]; 
    } 
    set { 
     this.ViewState["strWorkbookPath"] = value; 
    } 
} 

如果您需要ViewState的是什麼底漆,看看這個文章在MSDN上:Saving Web Forms Page Values Using View State。這有點過時,但仍然傳達了ViewState當前如何操作的基本知識。

+0

我對這個答案(和Anubhav的)感到很興奮,但是我把你的確切代碼(剪切/粘貼)添加到我的代碼隱藏中,而intellisense拒絕它:「非可調用成員'System.Web.UI.Control。ViewState'不能像使用方法一樣使用「 – 2013-02-18 18:00:29

+0

使用Session替換this.ViewState,應該可以工作,但是您仍然應該查看是什麼導致它被擦除 – 2013-02-18 18:05:40

+0

我去了您給我的鏈接,它幫助我修復了錯誤。需要方括號而不是括號...... – 2013-02-18 18:08:36

0

把你的頁面上有RUNAT =「server」屬性的隱藏字段,並使用腳本如下:

<script type="text/javascript"> 
    function uploadComplete(sender, args) { 
      var filename = args.get_fileName(); 
      $("#hiddden_field_id").val(filename); 
    } 
</script> 

現在,你應該在你的事件越來越映像名稱。

+0

這一個,我不明白。這個函數不會替代我的代碼隱藏事件處理程序嗎?那樣會不好...... – 2013-02-18 18:02:14

+0

然後你可以去做其他的工作。比如在你的代碼後面設置這個隱藏字段的值,並在稍後訪問它。 – gaurav 2013-02-18 18:06:26

0

我想你應該嘗試在會話中存儲,而不是一個隱藏字段值的頁面不重新加載,這是一個Ajax調用。因此,當單擊按鈕進行驗證時,實際上是另一個請求,但此頁面對象中隱藏字段的值和隱藏字段仍爲空。一旦您的工作在會話中完成了該值,請將其從中刪除,或將其設置爲不同的值。