利用用户控件设计站点页

最近在看sharepoint的一些文章,觉得还不错

之前我们已经处理了站点页,页模板,安全模式过程的基本组成部分。现在是时候从设计角度回顾讨论页模板的开发,我们将特别讨论怎么通过添加服务端控件的方式构造页模板去获得你所需要的设计功能和用户接口组件。

在ASP.NET 编程模型中,存在两种类型的服务端控件:自定义控件和用户控件,当设计页模板的时它们都是非常的有用。自定义控件更加的轻量级,在被部署到前端WEB服务器之前必须被编译进程序集DLL中。用户控件则更加地效率,因为你能借助VS 使用被提供的可视化设计去开发。

使用自定义控件构造页面

让我们从自定义控件的一个简单例子开始。ASP.NET中的服务端控件被定义为一个类从Control 类继承。然而,开发者经常选择创建自定义控件靠从WebControl的类派生,而它是从Control类继承的。下面的代码例子将会演示一个从WebControl类继承实现了HelloWorld功能的自定义控件,而这个功能是通过重写RenderContents方法并添加一些简单的代码(借助WSS对象模型)完成的。                

using System.Web.UI;
using System.Web.UI.WebControls;
using Microsoft.SharePoint;

namespace CustomSitePages {
  public class CustomControl1 : WebControl {
    protected override void RenderContents(HtmlTextWriter output) {
      SPWeb site = SPContext.Current.Web;
      output.Write("Current Site: " + site.Title);
      output.Write("<br/>");
      output.Write("Current Site ID: " + site.ID.ToString());
    }
  }
}
当你想在站点页使用用户控件的时候,你有两个选择去部署包含自定义用户控件的DLL。第一个选择,你可以编译带有强签名DLL并把它安装到GAC中。或者,你可以把DLL部署到宿主WEB应用的根目录(被包含在bin目录下)。注意当你打算部署带有自定义控件的DLL到bin目录下时,你可以选择带还是不带上强签名。
 
一旦自定义控件DLL被恰当地部署,你就可以使用ASP.NET 注册指令在一个页模板引用它。下面的代码例子呈现了一个的自定义控件页模板。
<%@ Page MasterPageFile="~masterurl/default.master"
    meta:progid="SharePoint.WebPartPage.Document" %>

<%@ Register Assembly="CustomSitePages, ... "
    Namespace="CustomSitePages" TagPrefix="CustomSitePages" %>


<asp:Content ID="main"
     ContentPlaceHolderId="PlaceHolderMain"
     runat="server">

<h3>A custom control example</h3>

<CustomSitePages:CustomControl1 ID="cc1" runat="server" />

</asp:Content>

就像你看到的,添加一个注册指令就像在VS中给项目添加一个DLL引用,因为这使得目标DLL中的公用组件在页中可用。然而注册指令也用CustomSitePages值定义了标签前缀特性。标签前缀值然后被用来实例化页面中的控件。

<CustomSitePages:CustomControl1 ID="cc1" runat="server" />

当你导航到HelloWorld.aspx,你应该可以看到页面通过控件的翻译输出而被呈现从而被用户看到。但是,这仅仅在宿主页面仍然是ghosted 状态才行得通。记住自定义的页仅仅允许控件作为安全控件被注册。假如一个用户用sharepoint desinger 自定义了HelloWorld.aspx,这个页开始在安全模式下执行,呈现的控件没有被作为安全控件被注册则会导致错误信息。

要去修复这个问题,你就必须添加一个自定义安全控件配置标签到宿主Web应用下得web.config文件中:

<SafeControl
  Assembly="CustomSitePages, ..."
  Namespace="CustomSitePages"
  TypeName="CustomControl1"
/>

注意当你添加安全控件配置时,你可以显示地为控件定义类型名或者你可以使用类型名值*去注册所有在特定命名空间下位于目标DLL中的服务端控件和WebPart 。

使用用户控件构造页面

用户控件代替自定义控件提供了更多的效率。它们更容易开发因为它们作为一个具有.ascx扩展名的文本文件被部署到前端Web服务器。ASP.NET 运行时提供了在运行的时候解析.ascx文件的功能并编译它到DLL中就像编译.aspx文件一样。让我们看看简单用户控件的源文件。下面关于.ascx文件的例子创建了一个简单的用户接口,用command button 和一个label,加上一个事件处理程序去提供一个经典的"Hello World" 功能。

<%@ Control Language="C#" %>

<script runat="server">
  protected void cmdButton1_Click(object sender, EventArgs e) {
    lblStatus.Text = "Hello, World";
  }
</script>
<asp:Button ID="cmdAddCustomer" runat="server" Text="Add Customer"
            OnClick="cmdAddCustomer_Click" />
<br/>
<asp:Label ID="lblStatus" runat="server" Text="" />
就像你看到的,从用户控件着手是相当的简单。你甚至可以使用记事本去创建和修改简单的.ascx文件。然而,你可能更喜欢用VS去开发.ascx文件,因为它提供了用户控件编辑器。这个可视化编辑器提供了重要的高级别的生产率,因为你可以使用标准的VS设计工具,像控件工具箱属性表,如图:

理解WSS不支持用户控件的自定义很重要。用户控件总是从前端Web服务加载和编译进DLL中的。更进一步说,用户控件仅仅是被某个具有Farm级别管理员权限的人拷贝到前端Web服务器的。因为这些理由,你就以推断总是可以在.ascx文件中写 in-line 代码。

假设你想在用户控件中编写依赖于WSS对项模型的in-line代码。那是很容易的。所有你必须去做的是添加一个assembly指令到.ascx文件顶部,它引用了Microsoft.SharePoint.dll.的4个部分。你也可以添加import指令去导入一个或者多个命名空间让你的代码更加的简明。

<%@ Control Language="C#" %>
<%@ Assembly Name="Microsoft.SharePoint, ..." %>
<%@ Import Namespace="Microsoft.SharePoint" %>

<script runat="server">
  protected override void OnLoad(EventArgs e) {
    SPWeb site = SPContext.Current.Web;
    lblDisplay.Text = "Current Site: " + site.Url;
  }
</script>

<asp:Label ID="lblDisplay" runat="server" />
之前已经介绍虚拟目录_layouts并且了解了它就是最合适的去部署应用页面的地方。WSS为部署用户控件提供了类似的虚拟目录。在TEMPLATE目录内部存在一个叫CONTROLTEMPLATES得子目录。这个目录包含了许多不同的作为标准的WSS安装部分而被部署用户控件。CONTROLTEMPLATES目录也是你应该部署自定义用户控件文件的地方。但是,在CONTROLTEMPLATES中创建自己的子目录去避免潜在的文件命名冲突是最好的做法。CustomSitePages 项目创建了一个在名为Litware目录下并拷贝用户控件到那个目录。每个自定义用户控件被拷贝到像下面一样的物理TEMPLATES/CONTROLTEMPLATES/Litware/UserControl1.ascx。每个Web应用在为_controltemplates的虚拟路径下被配置,则它是指向物CONTROLTEMPLATES目录。这就使得凭借相对于宿主Web应用的标准路径引用任何用户控件文件成为可能。例如,CustomSitePages项目中的一个用户控件能够靠使用像下面一样的虚拟路径而被引用~/_controltemplates/Litware/UserControl1.ascx当部署用户控件的时候,记住遵守同样的规则关于安全模式处理是很重要的。如果你想把一个用户控件放在可能要被定制化的站点页。.ascx文件必须作为宿主Web应用的Web.config中的安全控被注册。幸运的是如果你要部署定制化用户控件到虚拟目录_controltemplates 中,你没必要去担心这个。因为Web应用的标准的web.config文件已经包含了下面的SafeControl配置项:
<SafeControl
  Src="~/_controltemplates/*"
  IncludeSubFolders="True"
  Safe="True"
  AllowRemoteDesigner="True"
/>
既然你已经看到了怎么去创建并恰当地部署一个用户控件,最后一步是构建一个页模板,它会引用.ascx文件并且创建一个实例。类似于用自定义控件去构建页面,它也是凭借在页模板里放置注册指令去完成。然而,这个过程是不同于用户控件,因为注册指令需要Src属性,它指向目标.ascx文件的虚拟目录。
<%@ Page MasterPageFile="~masterurl/default.master"
    meta:progid="SharePoint.WebPartPage.Document" %>

<%@ Register TagPrefix="luc" TagName="UserControl1"
    src="~/_controltemplates/Litware/UserControl1.ascx" %>

<asp:Content runat="server" ContentPlaceHolderID="PlaceHolderMain">

  <luc:UserControl1 ID="id1" runat="server" />

</asp:Content>

你已经看到了所有的涉及到使用自定义控件和用户控件去构建站点页的步骤。它提供给你一个去创建可重用可版本化的组件的策略,也提供给你一种无论想添加什么定制化代码到运行在安全模式下页面的技术。

posted on 2011-09-02 14:10  BRUC  阅读(221)  评论(0)    收藏  举报

导航