0

我有一个非常简单的 ASP.NET 页面,可以上传 Excel 工作簿,然后对其进行处理。它使用 ASP.NET 上的 AJAX 工具包中的 AJAXFILEUPLOAD... 这是标记:

<%@ 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 上发布并没有答案。谁能给我一个想法从哪里开始?

4

3 回答 3

0

在您的页面上放置一个带有 runat="server" 属性的隐藏字段并使用以下脚本:

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

现在您应该在事件中获取图像名称。

于 2013-02-18T17:32:13.123 回答
0

我认为您应该尝试将该值存储在会话中而不是隐藏字段中,因为页面没有重新加载并且它是一个 ajax 调用。所以当点击按钮进行验证时,实际上是另一个请求,但是这个页面对象中隐藏字段的值和隐藏字段仍然是空的。在会话中完成该值的工作后,将其从那里删除或将其设置为其他值。

于 2013-02-18T17:34:57.520 回答
0

这是您应该存储在页面的 ViewState 中的信息,以便它在页面初始化时的回发和重置之间持续存在。将您的私有字符串成员更改为如下内容:

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

如果您需要了解什么是 ViewState,请查看 MSDN 上的这篇文章:使用 ViewState 保存 Web 表单页面值。它有点过时了,但仍然传达了 ViewState 当前如何运作的基础知识。

于 2013-02-18T17:43:28.603 回答