在《
创建自己的Webpart》一文中,已经介绍过创建Web Part的步骤,以及如何部署Web Part。但是,如果深入就会发现,创建一个复杂的Web Part其实是很麻烦的事情。尤其是在该模式下,Web Part的子控件或者内容都是依靠重载CreateChildControls或者RenderWebPart方法来进行输出。而WSS/OSS开发的一个很重要的方面就是对Web Part的开发。而根据目前流行的开发模式,就是前后台分离,这样的Web Part 开发不利于分工。尤其Web开发注重的界面,很难实现代码人员与美工人员的协同。采用基于UserControl的方式来创建Web Part不失为一个好的办法。
一、创建用户控件
在Visual Studio 2005(VS 2005)IDE环境中,文件-》新建-》网站-》空网站,在【位置】处选择【文件系统】方式,然后确定即可。就自动生成一个解决方案和一个空白的Web项目。
在空白项目上右键,【添加新项】,选择【Web 用户控件】。在Independent.ascx页面文件中,代码如下:
<%@ Control Language="C#" AutoEventWireup="true" CodeFile="Independent.ascx.cs" Inherits="Independent" %>
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
<asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Button" />
在文件Independent.ascx.cs中,代码如下:
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 Independent : System.Web.UI.UserControl
{
protected void Button1_Click(object sender, EventArgs e)
{
//显示文本框内容
ShowMessage(Page, this.TextBox1.Text);
}
public static void ShowMessage(System.Web.UI.Page page, string strMessage)
{
strMessage = strMessage.Replace(@"\", @"\\");
strMessage = strMessage.Replace("\r\n", "\\r\\n");
page.Response.Write("<script language=\"javascript\">\r");
page.Response.Write("alert(\"" + strMessage + "\");\r");
page.Response.Write("</script>\r");
}
}
二、创建Web Part壳
有了用户控件,这个用户控件与普通的用户控件一摸一样,没有做任何改变。我们如何使用它,使其成为一个可用的Web Part的一部分,我们需要为其创建一个Web Part的"壳"。为什么叫"壳",看完后面的介绍,也就不言自明了。
在现有的解决方案中,文件-》新建-》项目-》类库,按照在《
创建自己的Webpart》中的步骤,创建一个Web Part。代码如下:
#region 示例:动态加载UserControl
/// <summary>
/// 示例4:动态加载UserControl
/// </summary>
public class UserControlShell : WebPart
{
private string _UserControlSource = @"/_app_bin/UserControls/Independent.ascx";
[WebBrowsable(true), Personalizable(true)]
public string ControlSource
{
get { return _UserControlSource; }
set { _UserControlSource = value; }
}
protected override void CreateChildControls()
{
base.CreateChildControls();
if (_UserControlSource == null || _UserControlSource.Length == 0) return;
this.Controls.Clear();
try
{
//这个位置是虚拟路径
this.Controls.Add(Page.LoadControl(_UserControlSource));
}
catch (Exception ex)
{
Page.Response.Write(ex.Message);
}
}
protected override void Render(HtmlTextWriter writer)
{
base.Render(writer);
}
}
#endregion
三、部署Web Part和用户控件
部署的方式在《
创建自己的Webpart》中也作了介绍。将编译好的Web Part的DLL文件拷贝到_app_bin目录下,然后修改Web Application下的Web.config文件,将Web Part注册为安全的控件。下面是我的注册码:
<SafeControl Assembly="VeryTech.WebParts.Samples, Version=1.0.0.0, Culture=neutral, PublicKeyToken=c6479bda421222b8" Namespace="VeryTech.WebParts.Samples" TypeName="*" Safe="True" AllowRemoteDesigner="True" />
在部署完成后,如何使用用户控件呢?还需要将用户控件也拷贝的Web Application所指的主目录下的相应位置。这个位置可以打开IIS.MSC来查看。
根据示例中的代码,我们在_app_bin目录下新建文件夹UserControls,然后找到刚才创建的用户控件文件Independent.ascx和Independent.ascx.cs拷贝到UserControls文件夹下。当然,这个位置可以是[system drive\]Inetpub\wwwroot\wss\VirtualDirectories\80下的任何位置,可以通过在Web Part的ControlSource属性来设置用户控件的来源。
四、测试用户控件
将Web Part加入到Web 部件库,并添加到页面上。在TextBox中输入"Hello World",点击按钮试验一下。不错,对话框出现。嘿嘿:)
五、扩展用户控件功能
至此,我们已经知道为什么刚才那个Web Part要叫作"壳"或者"Shell"了。因为,我们的主要工作都交给用户控件去做了,刚才那个Web Part的功能仅仅是去Load一下用户控件,别的什么事也不做。
1.创建类文件
现在,这个用户控件还比较简单,我们稍微将其实用化一下。在用户控件项目上右键,【添加新项】,选择【类】。按系统默认,将新建的类文件放在App_Code目录下。然后再在这个项目中添加对Microsoft.SharePoint.dll的引用。在类文件中添加如下代码:
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 Microsoft.SharePoint;
using Microsoft.SharePoint.WebControls;
using Microsoft.SharePoint.Utilities;
namespace VeryTech.WebParts
{
/// <summary>
/// SPWebHelper 的摘要说明
/// </summary>
public class SPWebHelper
{
public SPWebHelper()
{
//
// TODO: 在此处添加构造函数逻辑
//
}
public int Add(int a, int b)
{
return a + b;
}
public string GetList(HttpContext Context)
{
SPSite site = SPControl.GetContextSite(Context);
string rtn = string.Empty;
SPListItemCollection listItems = site.AllWebs[0].Lists["共享文档"].Items;
foreach (SPListItem list in listItems)
{
rtn += list.Name + ";";
}
return rtn;
}
}
}
2.修改用户控件
修改用户控件的代码文件Independent.ascx.cs的内容如下:
添加引用:
using VeryTech.WebParts;
修改代码:
protected void Button1_Click(object sender, EventArgs e)
{
string rtn = string.Empty;
try
{
rtn = new SPWebHelper().GetList(Context);
}
catch(Exception exc)
{
rtn = exc.Message;
}
this.TextBox1.Text = rtn;
}
3.部署类文件
在做完这些之后,将用户控件文件按照之前的步骤更新到相应的位置。但是我们该把那个类文件放在哪儿呢?如果你放到与用户控件相同位置下,保管你不会成功。考虑到Asp 2.0的编译模式,在网站(WSS的Web应用)的主目录下,建立App_Code目录,将该类文件放在这个位置。测试,大功告成。在TextBox文本框中得到了共享文档的文件名。
结束:从这个过程可以看出,这种Web Part开发模式基本实现了分层的模式。用户控件的展现层,也就是ascx文件由美工去负责,页面上的内容数据源,也就是用户控件的cs文件的内容由编程人员完成。而编码这部分,也还可以进行分工(就是后面的专用类可以有人专门负责)。这样一来,分工就比较明晰了。同时,也提高了开发效率。还有一个优点就是调试也比较方便,尤其是对界面的调试(随便将用户控件拖到一个页面上就可以了)。