使用母版页、Ajax 更新面板、FormView 和对象数据源的文件上传






3.82/5 (8投票s)
使用母版页、Ajax 更新面板、FormView 和对象数据源的文件上传

引言
这是我为 ASP.NET 撰写的第一个文章。我通常使用 C#.NET 在网络领域编写代码,但自从几天前开始,我一直在从事 Web 开发,并遇到了各种问题。在找到我在项目中遇到的问题解决方案后,我写了这篇文章。你可以在这里查看我的博客。
背景
几天前,我正在尝试在我的项目中创建一个文件上传模块。这是一个基于 Ajax 的项目,带有母版-内容页。我正在使用 Form View 控件来插入、更新和显示数据,并使用对象数据源进行 ADO.NET。问题如下:
- Ajax 不支持文件上传控件(因为文件上传控件需要完整的回发事件),并且 Ajax 代码位于母版页中,但文件上传控件位于内容页内的 Form View 中。
- Form View 控件使用对象数据源来插入数据,在这里我无法将文件上传控件与对象数据源绑定,因为文件上传控件没有可绑定的属性。
为了解决这个问题,我在 ASP.NET 论坛中发布了我的问题,并且进行了大量的搜索,但我没有找到任何解决方案。
Using the Code
为了解决我的第一个问题,我得到了 ASP.NET 网站上其他人的帮助。要在 Ajax 中上传文件,需要将其注册为回发控件。要注册它,只需编写如下代码:
ScriptManager.GetCurrent(this).RegisterPostBackControl(Control Id);
但是问题在于第二点。我们如何将对象数据源属性与文件上传控件绑定?我没有找到任何可绑定的属性。所以我用另一种方法。在页面加载事件中,我将文件上传控件的文件名分配给一个文本框,并将该文本框与对象数据源绑定。这里所有控件,如文件上传控件、按钮、文本框,都在 Form View 控件中。所以我编写了如下代码:
if (Page.IsPostBack)
{
if (FormView1.CurrentMode == FormViewMode.Insert)
{
FileUpload objFU = (FileUpload)FormView1.FindControl("FileUpload1");
TextBox objTB = (TextBox)FormView1.FindControl("TextBox1");
if (objFU.HasFile)
{
objTB.Text = objFU.FileName;
objFU.SaveAs(Server.MapPath(".") + "/" + objFU.FileName);
}
}
}
现在问题已经解决。
在该解决方案中,我没有描述如何在 SQL Server 中访问数据库。你只需要使用该 SQL 脚本创建一个表:
CREATE TABLE [testFile]([fileName] [varchar](50) ,[other] [nchar](10))
这里还有一个部分,展示了 Ajax 功能如何获取服务器时间。因此,所有代码都位于 ASP.NET 的母版页中:
<%@ Master Language="C#" AutoEventWireup="true"
CodeFile="MasterPage.master.cs" Inherits="MasterPage" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0
Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Untitled Page</title>
</head>
<body>
<form id="form1" runat="server">
<asp:ScriptManager ID="ScriptManager1" runat="server" ></asp:ScriptManager>
<asp:UpdatePanel ID="upPnl" runat="server">
<ContentTemplate>
<div>
<asp:contentplaceholder id="ContentPlaceHolder1" runat="server">
</asp:contentplaceholder>
</div>
</ContentTemplate>
</asp:UpdatePanel>
</form>
</body>
</html>
对于内容页:
<%@ Page Language="C#" MasterPageFile="~/MasterPage.master"
AutoEventWireup="true" CodeFile="Default.aspx.cs"
Inherits="Default" Title="Untitled Page" %>
<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">
<div style="border:Solid 1px; width:350px; text-align:center;
padding:10px 5px 10px 5 px; ">
Non Ajax Area For File Upload
<asp:FormView ID="FormView1" runat="server"
DataSourceID="ObjectDataSource1" DefaultMode="Insert">
<InsertItemTemplate>
<asp:FileUpload ID="FileUpload1" runat="server" />
<asp:Button ID="Button1" runat="server"
CommandName="Insert" Text="Save" />
<br />
<asp:TextBox ID="TextBox1" Visible="false"
runat="server" Text='<%# Bind("FileName") %>'></asp:TextBox>
<br />
Other Text: <asp:TextBox ID="TextBox2"
runat="server" Text='<%# Bind("Other") %>'></asp:TextBox>
</InsertItemTemplate>
</asp:FormView>
<asp:ObjectDataSource ID="ObjectDataSource1"
runat="server" InsertMethod="Insert"
SelectMethod="Select" TypeName="BL" DataObjectTypeName="BL">
</asp:ObjectDataSource>
</div>
<br />
<div style="border:solid 1px; width:350px;
text-align:center;padding:10px 5px 10px 5 px; ">
Ajax Area To Get Server Time
<br />
<asp:Button ID="Button2" runat="server"
Text="Get Server Time" OnClick="Button2_Click" /><br />
Server Time Is:
<asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
</div>
</asp:Content>
在业务逻辑中,代码如下:
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using DbClass;
/// <summary>
/// Summary description for BL
/// </summary>
public class BL
{
DbClass.SqlDbAccess objDB = new SqlDbAccess
(ConfigurationManager.AppSettings["ConnStr"]);
public BL()
{
//
// TODO: Add constructor logic here
//
}
private string _fileName;
private string _other;
public string FileName
{
get { return _fileName; }
set { _fileName = value; }
}
public string Other
{
get { return _other; }
set { _other = value; }
}
public void Insert(BL objectBl)
{
objDB.ExecuteNonQuery("INSERT INTO
[test].[dbo].[testFile]([FileName],[Other])VALUES
('"+objectBl.FileName+"','"+objectBl.Other+"')");
}
public DataTable Select()
{
return objDB.GetDataTable("SELECT FileName,Other FROM [test].[dbo].[testFile]");
}
}
在内容页的代码隐藏文件中:
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
public partial class Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
ScriptManager.GetCurrent(this).RegisterPostBackControl(FormView1);
if (Page.IsPostBack)
{
if (FormView1.CurrentMode == FormViewMode.Insert)
{
FileUpload objFU = (FileUpload)FormView1.FindControl("FileUpload1");
TextBox objTB = (TextBox)FormView1.FindControl("TextBox1");
if (objFU.HasFile)
{
objTB.Text = objFU.FileName;
objFU.SaveAs(Server.MapPath(".") + "/" + objFU.FileName);
}
}
}
}
protected void Button2_Click(object sender, EventArgs e)
{
Label1.Text = DateTime.Now.ToString();
}
}
整个项目都附带在本文章中,请查看它以获取更多详细信息。