Я работаю над проектом, в котором пытаюсь динамически создать кнопку в code-behind динамически отправлять и загружать файл на сервер. Я использую AddHandler, но кнопка не возвращается. Я везде читал, что мне нужно перегенерировать эту кнопку после каждого поста из-за того, как работают веб-страницы. Я до сих пор не могу заставить эту кнопку работать. У меня есть главная страница с HTML:
<%@ Page Language="vb"
AutoEventWireup="false"
MasterPageFile="~/Site.Master"
CodeBehind="Departments.aspx.vb"
Inherits="Homepage.Departments" %>
<asp:Content ID="BodyContent" runat="server" ContentPlaceHolderID="MainContent">
<script type="text/javascript" src="~/Scripts/jquery-1.8.2.js"></script>
<script src="~/Scripts/jquery-ui-1.8.24.custom.min.js" type="text/javascript"></script>
<script type="text/javascript">
</script>
<div id="Top" runat="server"> </div>
<div id="Left" runat="server"></div>
<div id="Right" runat="server"></div>
</asp:Content>
Верхний, левый и правый div — это просто заполнители для динамического создания содержимого страницы. Код для страницы просто вызывает функцию в классе, который я разработал, и добавляет ее в один из div на странице (я слышал, что если бы я обработал ее в page_init, она должна создать страницу в правильном порядке. .):
Protected Sub Page_Init(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Init
*SNIP business logic to determine what information to pull*
'NewWebPart is my class that creates the custom parts and returns them as an object
For Each DeptLayoutRow As MyDataSet.DeptLayoutRow In DeptLayout
Dim NewPartObject As Object = NewWebPart.CreateNewPart
Select Case DeptLayoutRow.Area
Case 1
Top.Controls.Add(NewPartObject)
Case 2
Left.Controls.Add(NewPartObject)
Case 3
Right.Controls.Add(NewPartObject)
End Select
i += 1
Next
End If
End If
End If
End Sub
Функция CreateNewWebPart возвращает объект в виде таблицы с gridview, кнопкой и некоторым кодом JavaScript внутри. Важной частью этого класса является функция, создающая ту часть, с которой у меня возникли проблемы. Эта часть содержит представление сетки, в котором перечислены элементы в папке на сервере. Если пользователь хочет, он нажимает кнопку загрузки под gridview, а затем JavaScript создает оверлей, который позволяет ему щелкнуть нужный файл и загрузить его на сервер. Кнопка отправки - это та, с которой у меня проблемы:
Private Function CreateDocument() As Table
Dim Documents As New GridView
Documents.Width = width
Documents.Height = height
Dim table As New Table
'Dim Files As String()
Dim FileLocation As String = _
ConfigurationManager.AppSettings.Item("DeptLoc").ToString + _
"\" + DeptName + "\" + PartName
If Directory.Exists(FileLocation) Then
Dim DirInfo As New IO.DirectoryInfo(FileLocation)
Dim FileArray As IO.FileInfo() = DirInfo.GetFiles()
Dim FileInfo As IO.FileInfo
Dim Dt As New DataTable
Dt.Columns.Add("File Name", GetType(String))
Dt.Columns.Add("File Link", GetType(String))
Dt.Columns.Add("File Size", GetType(String))
Dt.Columns.Add("Last Updated", GetType(Date))
For Each FileInfo In FileArray
Dt.Rows.Add(FileInfo.Name, _
FileInfo.FullName, _
Math.Round(FileInfo.Length / 1024).ToString, _
FileInfo.LastWriteTime)
Next
Documents.DataSource = Dt
Documents.Attributes.Add("Class", "mGrid")
Documents.ID = "Documents" + IDNum.ToString
'This function creates and returns a table with Documents in the first cell
table = CreatePartTable(Documents)
'Create Upload file button'''''''''''''''''''''''''''''''''''''
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Dim btnUpload As New HtmlGenericControl
btnUpload.InnerHtml = "<button id='btnUpload" + IDNum.ToString + "'>Upload File</button>"
Dim UploadRow As New TableRow
Dim UploadRowCell As New TableCell
UploadRowCell.Controls.Add(btnUpload)
UploadRow.Cells.Add(UploadRowCell)
Dim UploadDiv As New HtmlGenericControl("DIV")
UploadDiv.ID = "UploadDiv" + IDNum.ToString
Dim lbl As New Label With {.Text = "Choose what files you would like to upload!"}
Dim FileUpload As New HtmlInputFile With {.ID = "FileUpload" + IDNum.ToString}
Dim btnSubmit As New Button With {.ID = "Submit" + IDNum.ToString, .Text = "Submit"}
'Neither of these seem to work either....
'btnSubmit.Attributes.Add("runat", "server")
'btnSubmit.Attributes.Add("onclick", "btnUploadSubmit_OnClick")
UploadDiv.Controls.Add(lbl)
UploadDiv.Controls.Add(New LiteralControl("<br />"))
UploadDiv.Controls.Add(New LiteralControl("<br />"))
UploadDiv.Controls.Add(FileUpload)
UploadDiv.Controls.Add(New LiteralControl("<br />"))
UploadDiv.Controls.Add(New LiteralControl("<br />"))
UploadDiv.Controls.Add(btnSubmit)
AddHandler btnSubmit.Click, AddressOf btnUploadSubmit_OnClick
Dim UploadDialogRow As New TableRow
Dim UploadDialogRowCell As New TableCell
UploadDialogRowCell.Controls.Add(UploadDiv)
UploadDialogRow.Cells.Add(UploadDialogRowCell)
Dim UploadDivJQuery As New UI.HtmlControls.HtmlGenericControl
Dim JQueryString As New StringBuilder
JQueryString.Append("<script type='text/javascript'>")
JQueryString.Append(" $(function() {")
JQueryString.Append(" $(""*[id$='UploadDiv" + IDNum.ToString + "']"").dialog({")
JQueryString.Append(" autoOpen: false,")
JQueryString.Append(" modal: true,")
JQueryString.Append(" show: 'clip',")
JQueryString.Append(" hide: 'clip'")
JQueryString.Append(" }); ")
JQueryString.Append(" $(""*[id$='btnUpload" + IDNum.ToString + "']"").click(function() {")
JQueryString.Append(" $(""*[id$='UploadDiv" + IDNum.ToString + "']"").dialog( 'open' );")
JQueryString.Append(" return false; ")
JQueryString.Append(" }); ")
JQueryString.Append(" });")
JQueryString.Append("</script>")
UploadDivJQuery.InnerHtml = JQueryString.ToString
Dim UploadDivJQueryRow As New TableRow
Dim UploadDivJQueryRowCell As New TableCell
UploadDivJQueryRowCell.Controls.Add(UploadDivJQuery)
UploadDivJQueryRow.Cells.Add(UploadDivJQueryRowCell)
table.Rows.Add(UploadRow)
table.Rows.Add(UploadDialogRow)
table.Rows.Add(UploadDivJQueryRow)
'To fix up the document's DataGrid the way we want it!
'This addhanlder for the documents gridview works fine...
AddHandler Documents.DataBound, AddressOf DocumentsDataGridHandler
Documents.DataBind()
End If
Return Table
End Function
Извините, если я написал слишком много, но я несколько дней искал ответ на эту проблему и, похоже, не могу понять. Я не уверен, что это из-за того, что я загружаю его не в правильном порядке, из-за того, что он находится в другом классе, или из-за того, что я использую мастер-страницы или что-то в этом роде.