2011-04-21 59 views
8

首先,我沒有使用UpdatePanel - 它看起來像是一個常見問題,但我甚至都不知道在我搜索此問題之前究竟發生了什麼。DetailsView中的FileUpload:HasFile始終爲false

我有一個DetailsView嘗試上傳文件並將文件名插入到數據庫中。問題是,HasFile總是出錯!任何想法我做錯了什麼?

C#:

public partial class DocManager : System.Web.UI.Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     if (!(System.Convert.ToBoolean(Session["Admin"]))) 
      Response.Redirect("Index.aspx"); 
    } 

protected void DetailsView1_ItemInserting(object sender, DetailsViewInsertEventArgs e) 
{ 
    FileUpload fu1 = (FileUpload) DetailsView1.FindControl("FileUpload1"); 
    if (fu1 == null) 
    { 
     e.Cancel = true; 
     StatusLabel.Text = "Could not find file upload"; 
    } 
    if (fu1.HasFile) 
    { 
     try 
     { 
      string filename = Path.GetFileName(fu1.FileName); 
      fu1.SaveAs(Server.MapPath("~/Docs/") + filename); 
      StatusLabel.Text = "Upload status: File uploaded!"; 
      e.Values["FileName"] = filename; 
     } 
     catch (Exception ex) 
     { 
      StatusLabel.Text = "Upload status: The file could not be uploaded. The following error occured: " + ex.Message; 
     } 

    } 
    else 
    { 
     e.Cancel = true; 
     StatusLabel.Text = "No file uploaded"; 
     return; 
    } 

    DropDownList dd1 = (DropDownList)DetailsView1.FindControl("DropDownList2"); 
    DropDownList dd2 = (DropDownList)DetailsView1.FindControl("DropDownList4"); 
    e.Values["Type"] = dd1.SelectedValue; 
    e.Values["MeetingID"] = dd2.SelectedValue; 

} 

protected void DetailsView1_ItemEditing(object sender, DetailsViewInsertEventArgs e) 
{ 
    FileUpload fu1 = (FileUpload)DetailsView1.FindControl("FileUpload2"); 
    if (fu1 == null) 
     e.Cancel = true; 
    if (fu1.HasFile) { 
     try 
     { 
      string filename = Path.GetFileName(fu1.FileName); 
      fu1.SaveAs(Server.MapPath("~/Docs/") + filename); 
      StatusLabel.Text = "Upload status: File uploaded!"; 
      e.Values["FileName"] = filename; 
     } 
     catch (Exception ex) 
     { 
      StatusLabel.Text = "Upload status: The file could not be uploaded. The following error occured: " + ex.Message; 
     } 
    } 
    else 
     e.Cancel = true; 

    DropDownList dd1 = (DropDownList)DetailsView1.FindControl("DropDownList1"); 
    DropDownList dd2 = (DropDownList)DetailsView1.FindControl("DropDownList3"); 
    e.Values["Type"] = dd1.SelectedValue; 
    e.Values["MeetingID"] = dd2.SelectedValue; 

} 

}

在pageLoad的唯一的事情是檢查,以確保在正常,沒有其他應在此之前將運行在用戶登錄。

形式本身:

<asp:DetailsView ID="DetailsView1" runat="server" Height="50px" Width="125px" 
    AutoGenerateRows="False" DataSourceID="Docs" DefaultMode="Insert" 
    OnItemInserting="DetailsView1_ItemInserting" 
    OnItemEditing="DetailsView1_ItemEditing" 
    > 
    <Fields> 
     <asp:BoundField DataField="Documents.Title" HeaderText="Title" 
      SortExpression="Documents.Title" /> 
     <asp:TemplateField HeaderText="Type" SortExpression="Type"> 
      <EditItemTemplate> 
       <asp:DropDownList ID="DropDownList1" runat="server"> 
        <asp:ListItem Selected="True" Value="Presentation">Presentation</asp:ListItem> 
        <asp:ListItem Value="Handout">Handout</asp:ListItem> 
        <asp:ListItem Value="Minutes">Minutes</asp:ListItem> 
        <asp:ListItem Value="Agenda">Agenda</asp:ListItem> 
        <asp:ListItem Value="Other">Other</asp:ListItem> 
       </asp:DropDownList> 
      </EditItemTemplate> 
      <InsertItemTemplate> 
       <asp:DropDownList ID="DropDownList2" runat="server"> 
        <asp:ListItem Selected="True" Value="Presentation">Presentation</asp:ListItem> 
        <asp:ListItem Value="Handout">Handout</asp:ListItem> 
        <asp:ListItem Value="Minutes">Minutes</asp:ListItem> 
        <asp:ListItem Value="Agenda">Agenda</asp:ListItem> 
        <asp:ListItem Value="Other">Other</asp:ListItem> 
       </asp:DropDownList> 
      </InsertItemTemplate> 
      <ItemTemplate> 
       <asp:Label ID="Label3" runat="server" Text='<%# Bind("Type") %>'></asp:Label> 
      </ItemTemplate> 
     </asp:TemplateField> 
     <asp:TemplateField HeaderText="MeetingID" SortExpression="MeetingID"> 
      <EditItemTemplate> 
       <asp:DropDownList ID="DropDownList3" runat="server" DataSourceID="Meetings" 
        DataTextField="Title" DataValueField="MeetingID"> 
       </asp:DropDownList> 
      </EditItemTemplate> 
      <InsertItemTemplate> 
       <asp:DropDownList ID="DropDownList4" runat="server" DataSourceID="Meetings" 
        DataTextField="Title" DataValueField="MeetingID"> 
       </asp:DropDownList> 
      </InsertItemTemplate> 
      <ItemTemplate> 
       <asp:Label ID="Label1" runat="server" Text='<%# Bind("MeetingID") %>'></asp:Label> 
      </ItemTemplate> 
     </asp:TemplateField> 
     <asp:TemplateField HeaderText="FileName" SortExpression="FileName"> 
      <EditItemTemplate> 
       <asp:FileUpload ID="FileUpload2" runat="server" /> 
      </EditItemTemplate> 
      <InsertItemTemplate> 
       <asp:FileUpload ID="FileUpload1" runat="server" /> 
      </InsertItemTemplate> 
      <ItemTemplate> 
       <asp:Label ID="Label2" runat="server" Text='<%# Bind("FileName") %>'></asp:Label> 
      </ItemTemplate> 
     </asp:TemplateField> 
     <asp:CommandField ShowEditButton="True" ShowInsertButton="True" /> 
    </Fields> 
</asp:DetailsView> 

ETA:整個表格:

<asp:Content ID="Content2" ContentPlaceHolderID="mainContent" Runat="Server"> 
<h1>Document Manager</h1> 

<h2>Existing Documents</h2> 
<asp:GridView ID="GridView1" runat="server" AllowSorting="True" 
    AutoGenerateColumns="False" DataSourceID="Docs" 
    OnRowDeleting="GridView1_RowDeleting" 
    DataKeyNames="DocID" BackColor="White" BorderColor="#E7E7FF" 
    BorderStyle="None" BorderWidth="1px" CellPadding="3" GridLines="Horizontal"> 
    <AlternatingRowStyle BackColor="#F7F7F7" /> 
    <Columns> 
     <asp:BoundField DataField="Documents.Title" HeaderText="Title" 
      SortExpression="Documents.Title" /> 
     <asp:BoundField DataField="FileName" HeaderText="FileName" 
      SortExpression="FileName" /> 
     <asp:BoundField DataField="Type" HeaderText="Type" SortExpression="Type" /> 
     <asp:BoundField DataField="Meetings.Title" HeaderText="Meeting" 
      SortExpression="Meetings.Title" /> 
     <asp:CommandField ShowDeleteButton="True" ShowSelectButton="True" /> 
     <asp:HyperLinkField DataNavigateUrlFields="FileName" Text="Download" /> 
    </Columns> 
    <FooterStyle BackColor="#B5C7DE" ForeColor="#4A3C8C" /> 
    <HeaderStyle BackColor="#4A3C8C" Font-Bold="True" ForeColor="#F7F7F7" /> 
    <PagerStyle BackColor="#E7E7FF" ForeColor="#4A3C8C" HorizontalAlign="Right" /> 
    <RowStyle BackColor="#E7E7FF" ForeColor="#4A3C8C" /> 
    <SelectedRowStyle BackColor="#738A9C" Font-Bold="True" ForeColor="#F7F7F7" /> 
    <SortedAscendingCellStyle BackColor="#F4F4FD" /> 
    <SortedAscendingHeaderStyle BackColor="#5A4C9D" /> 
    <SortedDescendingCellStyle BackColor="#D8D8F0" /> 
    <SortedDescendingHeaderStyle BackColor="#3E3277" /> 
</asp:GridView> 
<h2>Add New</h2> 
<asp:DetailsView ID="DetailsView1" runat="server" Height="50px" Width="125px" 
    AutoGenerateRows="False" DataSourceID="Docs" DefaultMode="Insert" 
    OnItemInserting="DetailsView1_ItemInserting" 
    OnItemEditing="DetailsView1_ItemEditing" 
    > 
    <Fields> 
     <asp:BoundField DataField="Documents.Title" HeaderText="Title" 
      SortExpression="Documents.Title" /> 
     <asp:TemplateField HeaderText="Type" SortExpression="Type"> 
      <EditItemTemplate> 
       <asp:DropDownList ID="DropDownList1" runat="server"> 
        <asp:ListItem Selected="True" Value="Presentation">Presentation</asp:ListItem> 
        <asp:ListItem Value="Handout">Handout</asp:ListItem> 
        <asp:ListItem Value="Minutes">Minutes</asp:ListItem> 
        <asp:ListItem Value="Agenda">Agenda</asp:ListItem> 
        <asp:ListItem Value="Other">Other</asp:ListItem> 
       </asp:DropDownList> 
      </EditItemTemplate> 
      <InsertItemTemplate> 
       <asp:DropDownList ID="DropDownList2" runat="server"> 
        <asp:ListItem Selected="True" Value="Presentation">Presentation</asp:ListItem> 
        <asp:ListItem Value="Handout">Handout</asp:ListItem> 
        <asp:ListItem Value="Minutes">Minutes</asp:ListItem> 
        <asp:ListItem Value="Agenda">Agenda</asp:ListItem> 
        <asp:ListItem Value="Other">Other</asp:ListItem> 
       </asp:DropDownList> 
      </InsertItemTemplate> 
      <ItemTemplate> 
       <asp:Label ID="Label3" runat="server" Text='<%# Bind("Type") %>'></asp:Label> 
      </ItemTemplate> 
     </asp:TemplateField> 
     <asp:TemplateField HeaderText="MeetingID" SortExpression="MeetingID"> 
      <EditItemTemplate> 
       <asp:DropDownList ID="DropDownList3" runat="server" DataSourceID="Meetings" 
        DataTextField="Title" DataValueField="MeetingID"> 
       </asp:DropDownList> 
      </EditItemTemplate> 
      <InsertItemTemplate> 
       <asp:DropDownList ID="DropDownList4" runat="server" DataSourceID="Meetings" 
        DataTextField="Title" DataValueField="MeetingID"> 
       </asp:DropDownList> 
      </InsertItemTemplate> 
      <ItemTemplate> 
       <asp:Label ID="Label1" runat="server" Text='<%# Bind("MeetingID") %>'></asp:Label> 
      </ItemTemplate> 
     </asp:TemplateField> 
     <asp:TemplateField HeaderText="FileName" SortExpression="FileName"> 
      <EditItemTemplate> 
       <asp:FileUpload ID="FileUpload2" runat="server" /> 
      </EditItemTemplate> 
      <InsertItemTemplate> 
       <asp:FileUpload ID="FileUpload1" runat="server" /> 
      </InsertItemTemplate> 
      <ItemTemplate> 
       <asp:Label ID="Label2" runat="server" Text='<%# Bind("FileName") %>'></asp:Label> 
      </ItemTemplate> 
     </asp:TemplateField> 
     <asp:CommandField ShowEditButton="True" ShowInsertButton="True" /> 
    </Fields> 
</asp:DetailsView> 
<asp:AccessDataSource ID="Docs" runat="server" 
    DataFile="~/App_Data/Database1.accdb" 
    DeleteCommand="DELETE FROM [Documents] WHERE [DocID] = ?" 
    InsertCommand="INSERT INTO [Documents] ([Title], [Type], [FileName], [MeetingID]) VALUES (@Title, @Type, @FileName, @MeetingID)" 
    SelectCommand="SELECT Documents.DocID, Documents.Title, Documents.FileName, Documents.Type, Meetings.Title, Documents.MeetingID FROM 
    (Documents LEFT OUTER JOIN Meetings ON Documents.MeetingID = Meetings.MeetingID)" 
    UpdateCommand= "UPDATE [Documents] SET [Title] = ?, [Type] = ?, [FileName] = ?, [MeetingID] = ? WHERE [DocID] = ?"> 
    <DeleteParameters> 
     <asp:Parameter Name="DocID" Type="Int32" /> 
    </DeleteParameters> 
    <InsertParameters> 
     <asp:Parameter Name="Documents.Title" Type="String" /> 
     <asp:Parameter Name="Type" Type="String" /> 
     <asp:Parameter Name="FileName" Type="String" /> 
     <asp:Parameter Name="MeetingID" Type="Int32" /> 
    </InsertParameters> 
    <SelectParameters> 
     <asp:SessionParameter Name="?" SessionField="UserID" /> 
    </SelectParameters> 
    <UpdateParameters> 
     <asp:Parameter Name="Title" Type="String" /> 
     <asp:Parameter Name="Type" Type="String" /> 
     <asp:Parameter Name="FileName" Type="String" /> 
     <asp:Parameter Name="MeetingID" Type="Int32" /> 
     <asp:Parameter Name="DocID" Type="Int32" /> 
    </UpdateParameters> 
</asp:AccessDataSource> 
<asp:Label ID="StatusLabel" runat="server" Text="Label"></asp:Label> 
<asp:AccessDataSource ID="Meetings" runat="server" 
    DataFile="~/App_Data/Database1.accdb" 
    SelectCommand="SELECT [MeetingID], [Title] FROM [Meetings] WHERE ([AdminID] = ?)"> 
    <SelectParameters> 
     <asp:SessionParameter Name="AdminID" SessionField="UserID" Type="Int32" /> 
    </SelectParameters> 
</asp:AccessDataSource> 

我還編輯在C#代碼的其餘部分的上方,這是沒有限制,只要

母版頁中的表單元素:

<body style="background-color: rgb(231, 231, 255);height:100%;margin:0px;padding:0px"> 
<form id="form1" runat="server"> 

ETA:我發現了問題。我一直在使用一個空的文本文件作爲測試 - 讀取爲0字節,混淆了文件上傳器認爲它沒有文件。向文件中添加一些文本使其完美工作。

感謝大家的幫助!

+0

這不應該是問題。我深深地看到了你的代碼,但我無法看到代碼的任何問題。你能發佈完整的表單設計和完整的頁面代碼嗎?我認爲問題是其他方面。 – 2011-04-21 15:04:07

+1

雖然它的第一個問題在Stackoverflow上,但你已經清楚地發佈你的問題並解釋你的問題。 – 2011-04-21 15:05:16

+0

頁面中的表單元素是什麼樣的? – 2011-04-21 15:10:18

回答

8

我發現了這個問題。我一直在使用一個空的文本文件作爲測試 - 讀取爲0字節,混淆了文件上傳器認爲它沒有文件。向文件中添加一些文本使其完美工作。

關於爲什麼一個大小爲0字節的文件與其他文件完全不同,因此完全沒有文件。

+0

幹得好,先生! – 2011-12-06 16:04:19

+0

看的FileUpload組件的源代碼,它很容易解釋: ''''公佈爾HasFile { 得到 { HttpPostedFile postedFile = this.PostedFile; if(postedFile!= null) return postingFile.ContentLength> 0; else return false; } }'''' 雖然這不符合[寫在MSDN]上的內容(https://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.fileupload。 hasfile%28V = vs.110%29.aspx) – Alex 2015-04-10 21:34:24

相關問題