65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.82/5 (8投票s)

2008年5月23日

GPL3

2分钟阅读

viewsIcon

111595

downloadIcon

1600

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

引言

这是我为 ASP.NET 撰写的第一个文章。我通常使用 C#.NET 在网络领域编写代码,但自从几天前开始,我一直在从事 Web 开发,并遇到了各种问题。在找到我在项目中遇到的问题解决方案后,我写了这篇文章。你可以在这里查看我的博客。

背景

几天前,我正在尝试在我的项目中创建一个文件上传模块。这是一个基于 Ajax 的项目,带有母版-内容页。我正在使用 Form View 控件来插入、更新和显示数据,并使用对象数据源进行 ADO.NET。问题如下:

  1. Ajax 不支持文件上传控件(因为文件上传控件需要完整的回发事件),并且 Ajax 代码位于母版页中,但文件上传控件位于内容页内的 Form View 中。
  2. 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();
    }
}       

整个项目都附带在本文章中,请查看它以获取更多详细信息。

© . All rights reserved.