带标题文本框的AJAXFileUpload

时间:2012-10-03 19:47:59

标签: c# ajaxcontroltoolkit asyncfileupload

相当直截了当。我只是希望用户能够在上传之前为文件添加标题。 (是的,我鼓励使用正确的文件名,但这不是重点。)

<asp:TextBox runat="server" ID="txtDocumentTitle" />
<ajaxToolkit:AjaxFileUpload runat="server" ID="ajxUploadNDA" OnUploadComplete="ajxUpload_Complete" Width="400px"   /><br />

    protected void ajxUpload_Complete(object sender, AjaxControlToolkit.AjaxFileUploadEventArgs e)
    {
        MyFile f = new MyFile();
        f.DocumentType = e.ContentType;
        f.FileBytes = e.GetContents();
        f.FileName = e.FileName;
        f.DocumentCategory = "Package Files";
        f.FileUploaded = DateTime.Now;
        f.DocumentTitle = txtDocumentTitle.Text;
        f.Save();

        DataBind();
    }

但是,在设置断点时,txtDocumentTitle.Text始终为空。我似乎无法强制完整的回发或找到任何其他方式来获取该文本框的当前值。我可以允许用户在上传文件后编辑这些属性,但这不是我喜欢的设计,原因有几个。 (它鼓励将值保留为默认值。)

我试过了:

    protected void Page_Init(object sender, EventArgs e)
    {
        ScriptManager.GetCurrent(Page).RegisterPostBackControl(ajxUploadNDA);
        ScriptManager.GetCurrent(Page).SupportsPartialRendering = false;
        ScriptManager.GetCurrent(Page).EnablePartialRendering = false;

    }

我试过

<ajaxToolkit:AjaxFileUpload runat="server" ID="ajxUploadNDA" OnUploadComplete="ajxUpload_Complete" Width="400px" onchange="if (confirm('Upload ' + this.value + '?')) this.form.submit();"  />

任何建议都非常受欢迎。

4 个答案:

答案 0 :(得分:1)

我通过在“设置文档标题”中添加一个按钮来解决它,它将文本框的值添加到会话中。然后,ajxUpload_Complete函数使用此Session变量在上载时将标题设置为该会话值。

由于某些原因,它很邋,,但这是我能做的最好的。

在Page_Load:

if (!Page.IsPostBack && !ajxUploadNDA.IsInFileUploadPostBack)
{
  Session.Remove("DefaultDocumentCategory");
  lblDocumentCategory.Text = "Data Package Files";
  Session.Remove("DefaultDocumentTitle");
  lblDocumentTitle.Text = "Data Package File";
}

protected void btnChangeDocumentAttributes_Click(object sender, EventArgs e)
{
    lblDocumentCategory.Text = cboDocumentCategory.SelectedValue;
    lblDocumentTitle.Text = txtDocumentTitle.Text;
    Session["DefaultDocumentCategory"] = lblDocumentCategory.Text;
    Session["DefaultDocumentTitle"] = lblDocumentTitle.Text;
}

我还在页面上添加了一个虚拟按钮,强制回发刷新我的gridview,显示上传的所有文件。

<asp:Button ID="btnForcePostBack" runat="server" Text="" Style="background-color: Transparent; color: inherit; border-style: none;" />

protected void ajxUpload_Complete(object sender, AjaxControlToolkit.AjaxFileUploadEventArgs e)
{

    MyFile f = new MyFile();
    f.DocumentType = e.ContentType;
    f.FileBytes = e.GetContents();
    f.FileName = e.FileName;
    f.FileUploaded = DateTime.Now;

    if (Session["DefaultDocumentCategory"] == null || Session["DefaultDocumentCategory"].ToString() == string.Empty) f.DocumentCategory = "Data Package Files";
    else f.DocumentCategory = Session["DefaultDocumentCategory"].ToString();
    if (Session["DefaultDocumentTitle"] == null || Session["DefaultDocumentTitle"].ToString() == string.Empty) f.DocumentTitle = "Data Package File";
    else f.DocumentTitle = Session["DefaultDocumentTitle"].ToString();
    f.Save();
    ajxUploadNDA.Page.ClientScript.RegisterStartupScript(this.GetType(), "RefreshParent", "<script type='text/javascript'>var btn = window.parent.document.getElementById('btnForcePostBack');if (btn) btn.click();</script>");
}

答案 1 :(得分:0)

使用ajax上传时,您只能立即保存,然后第二步是单独调用以从保存的位置获取文件并对其进行操作。我使用Uploadify和Uploadifive在多个异步上传时遇到了同样的问题。上传多个文件的第一步是保存到临时位置,然后进行第二次调用以检索它,调整大小并将其保存到云(Azure存储)。它不可能提出一个断点,因为线程遍布整个地方。这是一种奇怪的行为,特别是在上传单个文件时,但这是首先保存然后使用单独调用检索的最佳解决方案。

答案 2 :(得分:0)

问题是AjaxFleUpload控件使用隐藏框架来提交文件内容。您可以使用下面的脚本将文本框值传递给服务器:

Sys.Application.add_load(applicationLoadHandler);

function applicationLoadHandler() {
     var originalCreateForm = Sys.Extended.UI.AjaxFileUpload.prototype._createVForm;

     Sys.Extended.UI.AjaxFileUpload.prototype._createVForm = function () {
          originalCreateForm.call(this);

          var textBox = document.createElement("INPUT");
          textBox.setAttribute("type", "text");
          textBox.setAttribute("name", "<%= txtDocumentTitle.UniqueID %>");
          textBox.setAttribute("value", document.getElementById("<%= txtDocumentTitle.ClientID %>").value);

          this._vForm.appendChild(textBox);
     }
}

在服务器上,您可以从Request.Form集合中获取用户输入:

var title = Request.Form[txtDocumentTitle.UniqueID];

答案 3 :(得分:0)

我无法获得任何其他工作的答案。我最终将文本框放在ajax更新面板上。然后我为文本框OnTextboxChanged创建了一个事件,该事件将值存储在会话中。然后我可以从会话中获取UploadComplete中的值。