【问题标题】:ASP.NET: How to user the UploadFile Control inside ListView Control for uploading document in the web application?ASP.NET:如何使用 ListView 控件中的 UploadFile 控件在 Web 应用程序中上传文档?
【发布时间】:2011-11-29 22:31:59
【问题描述】:

我正在使用 ASP.NET 开发一个 Web 应用程序。现在,我正在处理管理任务,我想让管理员能够上传将显示在 Web 应用程序页面之一上的时事通讯。我正在尝试在 ListView 中使用 ListView 控件和 UploadFile 控件。 以这种方式一切正常,但代码隐藏有问题,这是我无法上传任何内容并在 listView 中显示的方式。

部分来自 ASP.NET 代码:

<asp:ListView ID="ListView1" runat="server" DataKeyNames="NewsletterID" 
             DataSourceID="SqlDataSource1" InsertItemPosition="LastItem" 
             oniteminserting="ListView1_ItemInserting">

             <InsertItemTemplate>
                 <tr style="">
                     <td>
                         <asp:ImageButton ID="InsertButton" ImageUrl="images/insert.png" Width="20px" runat="server" CommandName="Insert" />

                         <asp:ImageButton ID="CancelButton" ImageUrl="images/clear3.png" Width="20px" runat="server" CommandName="Cancel" />

                         <asp:HiddenField ID="HiddenField1" runat="server" Value='<%# Bind("Username") %>' OnPreRender="LoadUsername" />
                     </td>
                     <td>
                         <asp:TextBox ID="NewsletterTitleTextBox" runat="server" 
                             Text='<%# Bind("NewsletterTitle") %>' />
                     </td>
                     <td>
                         asp:FileUpload ID="fileUpload1" runat="server" size="10" />
                     <asp:HiddenField ID="HiddenField2" runat="server" Value='<%# Bind("Url") %>' /> 
                     </td>
                 </tr>
             </InsertItemTemplate>
             <ItemTemplate>
                 <tr style="">
                     <td>
                         <asp:ImageButton ID="DeleteButton" ImageUrl="images/delete.png" Width="20px" runat="server" CommandName="Delete" />

                         <asp:ImageButton ID="EditButton" ImageUrl="images/edit.png" Width="20px" runat="server" CommandName="Edit" />
                     </td>
                     <td>
                         <asp:Label ID="NewsletterTitleLabel" runat="server" Text='<%# Eval("NewsletterTitle") %>' />
                     </td>
                     <td>
                         <a href='<%# Eval("Url") %>' target="_blank">
                         <asp:Label ID="UrlLabel" runat="server" Text='<%# Eval("Url") %>' />
                         </a>
                     </td>
                 </tr>
             </ItemTemplate>


<asp:SqlDataSource ID="SqlDataSource1" runat="server" 
             ConnectionString="<%$ ConnectionStrings:testConnectionString %>" 
             DeleteCommand="DELETE FROM [Newsletter] WHERE [NewsletterID] = @NewsletterID" 
             InsertCommand="INSERT INTO [Newsletter] ([NewsletterTitle], [Url], [Username]) VALUES (@NewsletterTitle, @Url, @Username)" 
             SelectCommand="SELECT Newsletter.NewsletterID, Newsletter.NewsletterTitle, Newsletter.Url, Newsletter.Username FROM Newsletter INNER JOIN employee ON Newsletter.Username = employee.Username" 
             UpdateCommand="UPDATE [Newsletter] SET [NewsletterTitle] = @NewsletterTitle, [Url] = @Url, [Username] = @Username WHERE [NewsletterID] = @NewsletterID">
             <DeleteParameters>
                 <asp:Parameter Name="NewsletterID" Type="Int32" />
             </DeleteParameters>
             <InsertParameters>
                 <asp:Parameter Name="NewsletterTitle" Type="String" />
                 <asp:Parameter Name="Url" Type="String" />
                 <asp:Parameter Name="Username" Type="String" />
             </InsertParameters>
             <UpdateParameters>
                 <asp:Parameter Name="NewsletterTitle" Type="String" />
                 <asp:Parameter Name="Url" Type="String" />
                 <asp:Parameter Name="NewsletterID" Type="Int32" />
             </UpdateParameters>
         </asp:SqlDataSource>

修改后的代码隐藏(在 C# 中):

protected void Page_Load(object sender, EventArgs e)
{

}

protected void LoadUsername(object sender, EventArgs e)
{
    ((HiddenField)sender).Value = Service.User.ID;
}

protected void ListView1_ItemInserting(object sender, ListViewInsertEventArgs e)
{
    ListView lv = (ListView)sender;
    FileUpload fUpload = (FileUpload)lv.InsertItem.FindControl("fileUpload1");
    //string path = ("UploadedPix\\" + fUpload.FileName);
    //var tempPath = "some-temp-path-";
    var tempFile = fUpload.FileName;

    if (fUpload.HasFile)
    {
        try {
            fUpload.SaveAs(Server.MapPath("~/") + tempFile);
            HiddenField hField= (HiddenField)lv.InsertItem.FindControl("HiddenField2");
        }
        catch(Exception ex){
            e.Cancel = true;
        }
    }
}

稍微修改代码隐藏后,我得到以下错误:

无法将 NULL 值插入到列 'Url'、表 'psspdb.dbo.Newsletter' 中;列不允许空值。插入失败。 声明已终止。

此 ListView 绑定到数据库中的 Newsletter 表。该表的结构如下: NewsletterID、NewsletterTitle、url、用户名

用户名是 Usre 表中用户名的外键。通讯将采用 pdf 格式。我想要的是让管理员在用户单击此链接下载或预览时事通讯之前指定将显示给用户的时事通讯的标题。

【问题讨论】:

  • 您能描述一下您遇到的错误吗?
  • 这个错误是不是因为你没有将url分配给HiddenField2(代码隐藏中的hField变量)?

标签: c# asp.net asp.net-controls


【解决方案1】:

这个错误是不言自明的。插入时 url 字段为空白。尝试使 url 字段接受空值。然后尝试插入/上传,看看它是否有效。一旦你知道上传工作,你可以回来,然后处理 url 字段和值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-16
    • 1970-01-01
    • 2010-11-06
    • 2022-01-03
    • 1970-01-01
    • 2016-08-10
    • 2011-06-23
    相关资源
    最近更新 更多