技术开发 频道

在MOSS 2007中开发和使用Web User控件


介绍
   
    在.NET前的Visual Studio 时代Visual Studio开发人员就开始享受到Visual designers设计控件的速度和一致性带来的便利了。在微软公司 Office Server 2007 Web Part开发世界里,开发人员没有用来进行WebParts开发的visual designer。这意味着甚至要为最简单的控件而动态载入控件或者连接大量的字符串。(也可以用XSLT,这个问题改天再讨论)我们还没完全准备好放弃现在的visual designers提供的直观高效的开发方式。
    Visual Studio提供了设计User控件的功能,包括Web User控件。但是这些控件不能被作为SharePoint WebParts,不过我正想干这个事情。这篇文章将介绍创建独特的组件(Web Particles)的概念。在保持Web User控件开发人员仍然可以使用熟悉多产的visual designers的同时,提供SharePoint WebParts的全部的优点。我把这些组件成为称为“WebParticles”,因为每一个都只是WebPart最终提供的功能的一部分。

总述

    我们需要先创建一个Visual Studio网页应用工程,创建一个Web User 控件(ASCX),一个作为Web Part和ASCX Web控件的接口,以及一个我们可以在其中测试和调试组件的ASP.NET网页。

创建ASP.NET网页应用程序

   在Visual Studio里,建立一个新的ASP.NET网页应用程序(新的网站在这个练习中不会起作用)。输入SmartParticles作为工程的名字



   由于我们是为SharePoint开发这个部分的,我们需要一个SharePoint.dll的引用。如果你在一台有MOSS或者安装了SharePoint Services的机器上开发,这个文件一般在%CommonProgramFiles%\Microsoft Shared\Web Server Extensions\12\ISAPI Directory。在我这里,扩展路径是C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\12\ISAPI\Microsoft.SharePoint.dll。如果你没有安装SharePoint和MOSS,你需要从同样的路径把这个文件和Microsoft.SharePoint.Search.dll,Microsoft.SharePoint.Search.xml拷贝到你的电脑上。在两种情况下,都要选择Microsoft.SharePoint.dll并且在你的工程中设置一个到它的引用。Visual Studio会在工程输出中包含适当的文件。

 
    接下来,添加一个Web User控件文件到你的工程中,并命名为WebParticleControl.ascx。


    在控件设计中,添加三个文本框,一个下拉控件,一个Lable和两个Button,就像下面这样:



   我也建立了一个表来为文本框组织控件和标签,但这个练习是选作的。

    双击Submit按钮,在代码文件中产生btnSubmit_Click事件句柄。如果看不到这个文件,检查一下Solution Explorer上的“Show All Files”是否被选中:


   在btnSubmit_Click事件句柄中输入这些代码:
string _response = "Hello {0} {1} from {2}, {3}! Please reset the form!"; 
string szState = ddlState.SelectedValue; lblResults.Text =
string.Format(_response, txtFirstName, txtLastName, txtCity, szState);
   双击btnReset,产生Click句柄,在bntReset_Click句柄中输入这些代码:

txtCity.Text = ""; 
txtFirstName.Text = "";
txtLastName.Text = "";
ddlState.SelectedIndex = 0;
   然后,在你的工程中添加一个叫做WebParticle.cs的类文件。

 
  简单说一下这个类,它是从Microsoft.SharePoint.WebPartPages.WebPart继承而来,并且重载了CreateChildControls和RenderContents方法,以此来载入和显示我们在前面创建的ASCX Web控件。这个类继承了Microsoft.SharePoint.WebPartPages.WebPart类,所以你需要根据你的名称空间或类段来添加正确的using代码。

using Microsoft.SharePoint.WebPartPages;
   设置这个类和WebPart的继承关系:
public class WebParticle: WebPart
    我定义了两个属性,它们一起决定了载入Web Control ASCX文件的位置。如果你希望简化这个类的继承,只需重写这些属性的声明,它们一个定义了源目录,另一个定义了含有你的控件的文件名。

protected string UserControlPath = @"~/usercontrols/"; 
protected string UserControlFileName = @"webparticlecontrol.ascx";
    接下来,类会重载CreateChildControls方法来载入Web控件。在这个方法中,控件被从System.Web.UI.Control继承的Page属性通过Microsoft.SharePoint.WebPartPages.WebPart从源文件载入。Page属性允许到下面的ASP.NET Page例子(包括SharePoint的WebPart)的可编程接入。

Collapse 
protected override void CreateChildControls()
{
try
{
// load the control ... this could require GAC installation
// of your DLL to avoid File.IO permissions denial exceptions
_control = this.Page.LoadControl(UserControlPath + UserControlFileName);
// add it to the controls collection to wire up events
Controls.Add(_control);
}
catch (Exception CreateChildControls_Exception)
{
_exceptions += "CreateChildControls_Exception: " + CreateChildControls_Exception.Message;
if (AlwaysBubbleUpExceptions)
{
throw;
}
}//end catch
finally
{
base.CreateChildControls();
}//end try/catch/finally block
}//end protected override void CreateChildControls()

    接下来,我们重载从WebPart类继承来的RenderContents方法。选这个方法是因为,在SharePoint网页的生命周期中,当这个方法被调用时所有的先决条件都已经发生,包括创建和分配SharePoint变量,以及CreateChildControls方法。由于当这个方法被SharePoint ASP引擎调用时子控件总是存在,所以没必要在这里调用EnsureChildControls。
protected override void RenderContents(HtmlTextWriter writer) 
{
// not much to do here except to programmatically and cleanly
// handle exceptions
try
{
base.RenderContents(writer);
}
catch (Exception RenderContents_Exception)
{
_exceptions += "RenderContents_Exception: " + RenderContents_Exception.Message;
if (AlwaysBubbleUpExceptions)
{
throw;
}
}
finally
{
if (_exceptions.Length > 0 && AutoWriteExceptions)
{
writer.WriteLine(_exceptions);
}
}//end try/catch/finally
}//end protected override void RenderContents(HtmlTextWriter writer)
签署和建立工程

   我们还没准备好建立类。因为我们打算让WebPart和Web User控件位于微软Office SharePoint Server和Global Assembly Cache里。我们需要分配一个Strong Name key并签署控件。在Solution Explorer中,在SmartParticles工程点上点击右键,选择属性,工程属性页面就会打开。在左边的选项中选择Signing标签。查看并确保“Sign the assembly”框被选中,然后在"Choose a strong name key file"的下拉列表中选择<New...>。



   “Key file name”中输入“SmartParticles.snk”。别选“Protect my key file with a password”,除非你想用密码来保护你的key文件(这样也不错)。



   点击“OK”。Strong Name Key文件SmartParticles.snk就被加入到工程中了。现在通过Visual Studio Build菜单来构建工程。

配置WebPart和Web User控件

   和配置SharePoint WebPart相比,建立一个SharePoint WebPart相对简单。因为采用的是WebParticle方法,我们不得不采用ASCX文件和编译过dll文件,这个dll文件包含支持ASCX Web User控件的类,并且包含会实实在在成为SharePoint WebPart的类。为了配置WebParticles,下面有一个需要做的事情的总结。

总结


" 编译工程
" 复制ASCX Web User控件到/UserControls/目录(或你指定的目录)。
" 复制编译过的DLL到Global Assembly Cache  。
" Discover组件的publicKeyToken属性 。
" 为web.config文件中我们的每个类添加恰当的SafeControl entries。
" 在SharePoint的web.config文件的assemblies段添加一个组件元素 。
" 建立一个名为SmartParticles.WebPart 的XML文件,其中包含配置SharePoint所需的必要信息。
" 上传名为SmartParticles.WebPart的XML文件到SharePoint WebPart库 。
" 测试安装结果 。

0
相关文章