![](/img/trans.png)
[英]ASP.NET - How to load page via server-side code (C#) with MVC Pattern in place?
[英]ASP.Net AjaxControlToolkit AsyncFileUpload in update panel that is created in server-side code with master page c#
我一直忙於整個上午,試圖從asp.net AjaxControlToolkit獲得AsyncFileUpload控件以在我的情況下正常工作,但是沒有運氣。
我有一個啟用Ajax的頁面,該頁面向用戶顯示問題,然后允許在不進行整頁發帖的情況下向前和向后瀏覽問題,可以在頁面上顯示多個問題,其中一個或多個問題可以是文件上傳控件。 該頁面使用的母版頁包含form元素,由於許多答案似乎已將其更改,因此我對其進行了修改。
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()");
}
其他答案表明,控件的可見設置在true / false之間切換時存在問題,但是當直接通過url加載頁面或使用應用程序中的“下一步”和“后退”按鈕進行導航時,控件的可見性永遠不會改變。
盡管這確實使我考慮到,因為控件不在頁面的aspx代碼上,而是在服務器端加載的,所以那里可能存在問題。 我因此而無法觸發“后退”和“后退”按鈕事件的問題,不得不最終將代碼實際添加到這些控件的updatepanel中,以觸發事件,但這不是問題控件的選項,因為它會發生變化從一頁到另一頁。
希望能解決問題的最后一點信息,該控件確實出現在頁面上,我可以單擊它並瀏覽到一個文件,但是當我選擇該文件時,它似乎調用了Page_Load,並且沒有其他顯示,隨后出現了兩個彈出窗口
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中的螢火蟲中,我還得到以下可能與以下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版本作為最新版本,問題仍然存在。
問題解決了
我沒有意識到的是,發生部分頁面回發時,沒有填充任何動態創建的字段。 看一看之后:
我發現控件需要在頁面加載之前重新初始化,即在Page_Init中,我稍稍更改了代碼,以便在_displaySingleQuestion()方法中告訴會話“問題ID”是什么,然后在Page_Init中調用該方法,以便控件當前問題在要通過save方法查詢的頁面上。
public void Page_Init(object sender, EventArgs e)
{
logger.Debug("Page_Init START");
if (!Page.IsPostBack) { Session["qid"] = 0; }
int qid = Convert.ToInt32(Session["qid"]);
if (qid > 0)
{
_displaySingleQuestion(_formObject, qid);
}
logger.Debug("Page_Init END");
}
這也意味着在頁面可以繼續之前,需要重新初始化AsyncFileUpload,完成此操作后,我的日志記錄方法現在記錄了成功調用fileuploadClick()事件。
注意,我添加了這一行
if (!Page.IsPostBack) { Session["qid"] = 0; }
因此,它將僅嘗試獲取部分頁面回發而不是整個頁面的值,例如第一次加載頁面時。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.