2013-02-18 60 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调用。因此,当单击按钮进行验证时,实际上是另一个请求,但此页面对象中隐藏字段的值和隐藏字段仍为空。一旦您的工作在会话中完成了该值,请将其从中删除,或将其设置为不同的值。