Yêu cầutải lên một tập tin đến máy chủ tự động bên trong một bảng cập nhật không làm việc lần đầu tiên
Tôi cố gắng để tải lên một tập tin, ngay sau khi một người dùng chọn nó. Tôi phải đáp ứng các yêu cầu sau:
- Nút này trông giống như các nút khác trong ứng dụng.
- Tệp được tải lên ngay sau khi người dùng chọn nó.
- Tôi cần nó nằm trong UpdatePanel vì tôi phải thực hiện các cập nhật có điều kiện cho trang. Tôi CAN thực hiện đăng lại đầy đủ đối với sự kiện được chọn (a.k.a
onchange
).
mã hiện
Sau đây là cách tập tin quan điểm của tôi trông:
<asp:UpdatePanel ID="upData" UpdateMode="Conditional" runat="server">
<ContentTemplate>
<div style="width: auto; float: right;">
<asp:Button ID="btnFileImportSkin" CssClass="ButtonSkin AddButton" Text="Import" Style="position: absolute; z-index: 2;" runat="server" OnClientClick="Javascript:onImport(); return false;" />
<asp:FileUpload ID="fileImport" Visible="false" Style="position:relative; opacity:0;" runat="server" onchange="Javascript:onFileSelected();" />
<%-- onchange="Javascript:this.form.submit();" /> --%>
<%-- <asp:Button ID="btnUpload" runat="server" OnClientClick="Javascript:alert('Uploading...'); __doPostBack('<%= btnUpload.ID %>', ''); return false;" /> --%>
<asp:Button ID="btnUpload" OnClick="btnUpload_Click" runat="server" />
</div>
</ContentTemplate>
<Triggers>
<asp:PostBackTrigger ControlID="btnUpload" />
</Triggers>
</asp:UpdatePanel>
liên quan Javascript:
<script type="text/javascript">
function onImport() {
var fileImportClientId = '<%= fileImport.ClientID %>';
document.getElementById(fileImportClientId).click();
}
function onFileSelected() {
alert("File Selected");
// I have tried calling the function directly and with a timeout
setTimeout(onUpload, 20);
}
function onUpload() {
var btnUploadClientId = '<%= btnUpload.ClientID %>';
document.getElementById(btnUploadClientId).click();
}
</script>
Mã đằng sau:
protected void btnUpload_Click(object sender, EventArgs e)
{
// PostedFile is null first time code gets here on user selecting a file
if (fileImport.PostedFile != null)
{
if (fileImport.PostedFile.FileName.Length > 0)
{
ImportFromFile();
}
}
}
Giải thích/Dòng
- dùng nhấp vào nút
btnFileImportSkin
. - Hàm
onImport
được gọi, nhấp chuột theo chương trình trên nútfileimport
. - Người dùng chọn tệp và nhấn Mở.
onFileSelected
được gọi.onUpload
được gọi thành công.btnUpload_Click
được gọi thành công mỗi lần.
Tuy nhiên các Vấn đề là
fileImport.PostedFile là null người sử dụng lần đầu tiên chọn một tập tin. Mọi thứ đều hoạt động tốt lần thứ hai và từ đó trở đi.
liên quan
This question liên quan chặt chẽ đến vấn đề của tôi, nhưng OP lẽ muốn một giải pháp upload Async như trong Gmail. Tôi đã cố gắng làm như sau như trong các câu trả lời cho câu hỏi này:
- __doPostBack() trong trường hợp OnClientClick
btnUpload
- this.form.submit() onchange trường hợp kiểm soát
FileUpload
tôi. - Thiết lập thuộc tính onchange của
FileUpload
kiểm soát trong Page_PreRender
Ghi chú bổ sung
- điều này đã làm việc một cách hoàn hảo khi tôi không có bản cập nhật tấm. Tôi đã làm this.form.submit() trực tiếp trong sự kiện onchange của điều khiển
FileUpload
. - khuôn khổ mục tiêu là NET 4,0
LƯU Ý: Thêm một Visible = "false" trong FileUpload
kiểm soát trên. Đó là vấn đề nhưng tôi đã bỏ qua nó trong khi đặt câu hỏi.
Cả html và javascript đều nằm trong Kiểm soát người dùng. –
Bạn có chắc chắn rằng nó hoạt động lần đầu tiên? Nó cũng làm việc cho tôi khi tôi nhấp vào 'btnFileImportSkin' lần thứ hai. –
Có, tôi là 110%. :) Tôi chỉ nhấp vào nút một lần và mã truy cập điểm ngắt lần đầu tiên, mọi lúc. – BeeTee2