我整个早上都在试图从 asp.net AjaxControlToolkit 中获取 AsyncFileUpload 控件以在我的情况下工作,但没有运气。
我有一个启用 Ajax 的页面,该页面向用户显示问题,然后允许在不需要整页回帖的情况下返回和转发问题,页面上可以显示多个问题,其中一个或多个问题可以是文件上传控件。该页面使用了一个母版页,其中包含我修改的表单元素,因为众多答案似乎表明它是问题所在。
https://stackoverflow.com/a/2918382/728841
<form id="form1" runat="server" enctype="multipart/form-data" method="post">
页面和解决方案都引用了 AjaxControlToolkit
<%@ Register Assembly="AjaxControlToolkit" Namespace="AjaxControlToolkit" TagPrefix="cc1" %>
构建问题的代码如下
1. private Control _generateControl(FormFields formFieldObject, string questionID) {
2. logger.Debug("start of method _generateControl()");
3. Control genericControl = _formBLL.getControlForForm(formFieldObject);
4. Type typeofcontrol = genericControl.GetType();
5. logger.Debug(typeofcontrol.ToString());
6.
7. HtmlGenericControl controlHolder = new HtmlGenericControl("div");
8. controlHolder.ID = _ns + "formfieldHolder_" + formFieldObject.id;
9. controlHolder.Attributes.Add("class", _ns + "formfieldHolder");
10.
11. if (typeofcontrol == typeof(AsyncFileUpload))
12 {
13. #region display question number and question
14. Label questionIDLabel = new Label();
15. questionIDLabel.CssClass = _ns + "questionIDLabel";
16. questionIDLabel.Text = questionID;
17. Label questionText = new Label();
18. questionText.CssClass = _ns + "questionText";
19. questionText.Text = formFieldObject.name;
20. #endregion
21.
22. #region add holder for file upload control
23. HtmlGenericControl questionControlHolder = new HtmlGenericControl("div");
24. questionControlHolder.Attributes.Add("class", _ns + "questionControlHolder");
25. genericControl.ID = _ns + "questionControl_" + formFieldObject.id;
26. #endregion
27.
28. AsyncFileUpload fuc = (AsyncFileUpload)genericControl;
29. fuc.ID = _ns + "questionControl_" + formFieldObject.id;
30. fuc.ClientIDMode = ClientIDMode.AutoID;
31. fuc.UploadedComplete += fileuploadClick;
32. fuc.UploadedFileError += fileuploadError;
33. questionControlHolder.Controls.Add(fuc);
34.
35. // add the controls to the holder
36. #region add controls to page
37. controlHolder.Controls.Add(questionIDLabel);
38. controlHolder.Controls.Add(questionText);
39. controlHolder.Controls.Add(questionControlHolder);
40. #endregion
41. }
42. return controlHolder;
43. }
然后将控件添加到 aspx 页面中的占位符
<asp:UpdatePanel ID="questionPanel" runat="server" UpdateMode="Conditional">
<ContentTemplate>
<asp:PlaceHolder ID="QuestionSection" runat="server">
</asp:PlaceHolder>
</ContentTemplate>
</asp:UpdatePanel>
以下是应该调用的方法,但从 Visual Studio 调试和检查日志文件中,这些方法永远不会被命中。
public void fileuploadError(object sender, AsyncFileUploadEventArgs e)
{
logger.Debug("START method fileuploadError()");
logger.Debug("END method fileuploadError()");
}
public void fileuploadClick(object sender, AsyncFileUploadEventArgs e)
{
logger.Debug("START method fileuploadClick()");
logger.Debug("END method fileuploadClick()");
}
其他答案表明控件的可见设置在真/假之间切换存在问题,但是当页面直接由 url 加载或使用应用程序中的下一步和后退按钮导航时,控件的可见性永远不会改变。
尽管这确实使我考虑到,由于控件不在页面的 aspx 代码上,而是在服务器端加载,因此那里的某个地方可能存在问题。由于这个原因,我遇到了下一个和后退按钮事件未触发的问题,最终不得不将代码实际添加到更新面板中以使这些控件触发事件,但这不是问题控件的选项,因为它会发生变化从一页到另一页。
希望解决解决方案的最后一点信息,该控件确实出现在页面上,我可以单击它并浏览到一个文件,但是当我选择了该文件时,它似乎调用了 Page_Load 并且没有其他任何内容,并且出现了以下 2 个弹出窗口
Server Response Error: 'Unknown Server Error'
Do You want to see the response page?
接着
Unhandled Exception: Server Response Error: 'Unknown Server Error'
这发生在所有测试过 FF 8、Chrome 15.0 和 IE 9 的浏览器中
在 Firefox 的 firebug 中,我还收到以下可能相关的 javaScript 错误
Index or size is negative or greater than the allowed amount
[Break On This Error] Type.registerNamespace("Sys.Extended.U...FileUploadEventArgs",Sys.EventArgs);
任何帮助,将不胜感激。
编辑13/12/2011 我正在使用今天下载的 AjaxControlToolkit 版本 4.1.5 作为最新版本,但问题仍然存在。