C# AJAXFileUpload和标题文本框

C# AJAXFileUpload和标题文本框,c#,ajaxcontroltoolkit,asyncfileupload,C#,Ajaxcontroltoolkit,Asyncfileupload,相当直接。我只是希望用户能够在上传之前添加一个文件标题。(是的,我鼓励使用合适的文件名,但这不是重点。) 我已经试过了 <ajaxToolkit:AjaxFileUpload runat="server" ID="ajxUploadNDA" OnUploadComplete="ajxUpload_Complete" Width="400px" onchange="if (confirm('Upload ' + this.value + '?')) this.form.submit();"

相当直接。我只是希望用户能够在上传之前添加一个文件标题。(是的,我鼓励使用合适的文件名,但这不是重点。)

我已经试过了

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


任何建议都是非常受欢迎的。

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

问题在于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);
     }
}

我在“设置文档标题”中添加了一个按钮,将文本框的值添加到会话中,从而解决了这个问题。然后,ajxUpload_Complete函数使用此会话变量为上传时的会话值设置标题

出于几个原因,这很草率,但这是我能做的最好的了

在“加载”页面上:

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>");
}

受保护的void ajxUpload_Complete(对象发送方,AjaxControlToolkit.AjaxFileUploadEventArgs e)
{
MyFile f=新的MyFile();
f、 DocumentType=e.ContentType;
f、 FileBytes=e.GetContents();
f、 FileName=e.FileName;
f、 fileupload=DateTime.Now;
如果(Session[“DefaultDocumentCategory”]==null | | Session[“DefaultDocumentCategory”].ToString()==string.Empty)f.DocumentCategory=“数据包文件”;
else f.DocumentCategory=会话[“DefaultDocumentCategory”].ToString();
如果(Session[“DefaultDocumentTitle”]==null | | Session[“DefaultDocumentTitle”].ToString()==string.Empty)f.DocumentTitle=“数据包文件”;
else f.DocumentTitle=会话[“DefaultDocumentTitle”].ToString();
f、 Save();
ajxUploadNDA.Page.ClientScript.RegisterStartupScript(this.GetType(),“RefreshParent”,“var btn=window.parent.document.getElementById('btnForcePostBack');if(btn)btn.click();”;
}

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

在后面的代码中,我保护了void Page_Init(object sender,EventArgs e){this.Page.ClientScript.RegisterStartupScript(this.GetType(),“StartupScript”,“Sys.Application.add_load(function(){applicationLoadHandler();});”,true)}在.aspx页面上:function applicationLoadHandler(){var originalCreateForm=…prototype…=function(){originalCreateForm.call(this);…this.\u vForm.appendChild(textBox);}}但我尝试使用Request.Form的任何内容。Form始终为空。抱歉前面的评论。简言之,我尝试了我能想到的所有代码和请求。表单始终为空。@Serinus,当您使用
RegisterStartupScript
方法执行脚本时,Application.load事件已经传递,因此您不需要将重写AjaxFileUpload的函数注册为事件处理程序。尝试将脚本放在页面上ScriptManager控件正下方的我的答案中,或将启动脚本更改为
applicationLoadHandler()而不将此函数附加到
系统应用程序加载
事件
var title = Request.Form[txtDocumentTitle.UniqueID];
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;
}
<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>");
}