专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »办公软件 » 自定义导航内容:MOSS中创建自定义内容类型 »正文

自定义导航内容:MOSS中创建自定义内容类型

来源: 发布时间:星期日, 2009年2月8日 浏览:8次 评论:0
  本文举例源代码或素材下载

  :简要介绍

  某类内容组可重用设置使用内容类型可致管理元数据模板以及项目和文档行为内容类型在网站WebSite级别定义并用于列表和库站点内容类型是可以独立于任何特定站点集合、站点、列表或文档库而建立元数据定义

  MOSS系统提供在 %CommonProgramFiles%Microsoft SharedWeb Server Extensions12TemplateFeaturesCtypes 文件夹中定义你可以查看该文件夹中ctypeswss.xml文件包含所有内容类型定义

   2:系统内容类型

<ContentType ID="0x"
Name="$Resources:"
Group="_Hidden"
Sealed="TRUE"
Version="0">
<FieldRefs>
<FieldRef ID="{c042a256-787d-4a6f-8a8a-cf6ab767f12d}" Name="ContentType"/>
</FieldRefs>
</ContentType>
  在ctypeswss.xml文件中个内容类型为所有内容类型最终都是从内容类型继承而来从下图可以清晰看出:

MOSS中创建自定义内容类型

   3:内容类型ID

  上图右边代表内容类型ID个内容类型都有个ID属性这个ID是内容类型标识个内容类型ID都包括他父内容类型ID所以所有内容类型前两位就是Sytem内容类型ID这样我们就可以通过解析内容类型id来分析内容类型继承体系

  内容类型ID有两种命名方式:

  1. 父内容类型ID+两个十 6进制数(不包括”00”)

  2. 父内容类型id+“00”+十 6进制GUID

  这里内容类型是个特例id是“0x”其他内容类型必须遵守上面两种约定种由于只包括两个十 6进制数所以他强调是id简洁性第 2种包括GUID强调是该内容类型种都有适合情况

  父内容类型ID+两个十 6进制数(不包括”00”)

  Wss般使用这种方式来生成默认内容类型比如基本内容类型Itemid是0x01Item是儿子Documentid是0x0101folderid是0x0120通过解析id你可以看出Document和folder都是Item儿子如下图:

MOSS中创建自定义内容类型

MOSS中创建自定义内容类型

  父内容类型id+“00”+十 6进制GUID

  Wss使用这种命名id方式创建内容类型主要在以下两种情况

  1. 站点内容类型(基于其他类型创建)

  2. 列表类型(将站点类型添加到列表中时得到站点类型例子拷贝)

  例如有个内容类型id是"0x010100D5C2F139516B419D801AC6C18942554D",通过这个id可以看出以下两点:

  1. 是Document内容类型直接基础而来

  2. 当Document内容类型被填加到列表时个列表内容类型被创建

  当父类型是以下情况时我们推荐你使用GUID方式创建内容类型id

  1. 父类型为wss默认内容类型比如Document

  2. 通过第 3方工具开发内容类型这种你要确定第 3方开发内容类型和wss默认提供没有冲突

  内容类型id长度最大是512s即不能超过 1,024 个由于有这个限制我们id命名可以根据需要灵活去控制否则就会出现超出情况

   4:创建自定义内容类型

  1. 我们创建个基于Event类型自定义内容类型项目结构如下图:

MOSS中创建自定义内容类型

  2. _disibledevent=><Elements Id="5f0c1259-87bc-4d63-bfc8-6f4997ec3f20" xmlns="http://schemas.microsoft.com/sharepo/">
<ContentType ID="0x010200730061eb7d784bb786f4ac157702b8c7" Name="OnlineEvent" Group="Development"
Description="Developing Content Type" Version="0">
<FieldRefs>
<FieldRef ID="{5FCA124E-66FD-4e70-B3CE-D4B7C97D8A0E}" Name="StatusField"
DisplayName="Status Field" Required="TRUE" />
<FieldRef ID="{9451F129-78A1-47f0-8CA5-AB7F0D51902C}" Name="NumberOfAttendeesField"
DisplayName="Number Of Attendees" Required="FALSE" />
<FieldRef ID="{63DF93F8-B6E8-4c66-A1CB-66C1E677AF45}" Name="EventTypeField"
DisplayName="Event Type" Required="TRUE" />
<FieldRef ID="{2071EA0D-3F61-4de4-9A68-7C9C1047AC19}" Name="AudienceTypeField"
DisplayName="Audience Type" Required="TRUE" />
</FieldRefs>
</ContentType>
<Field ID="{5FCA124E-66FD-4e70-B3CE-D4B7C97D8A0E}" Type="Choice" Name="StatusField"
DisplayName="Status" StaticName="StatusField" Hidden="FALSE" Required="TRUE" Sealed="FALSE">
<CHOICES>
<CHOICE>None</CHOICE>
<CHOICE>Approved </CHOICE>
<CHOICE>Rejected</CHOICE>
</CHOICES>
<Default>None</Default>
</Field>
<Field ID="{9451F129-78A1-47f0-8CA5-AB7F0D51902C}" Type="Number" Name="NumberOfAttendeesField"
DisplayName="Number Of Attendees" StaticName="NumberOfAttendeesField" Hidden="FALSE" Required="FALSE" Sealed="FALSE" />
<Field ID="{63DF93F8-B6E8-4c66-A1CB-66C1E677AF45}" Type="Choice" Name="EventTypeField"
DisplayName="Event Type" StaticName="EventTypeField" Hidden="FALSE" Required="TRUE" Sealed="FALSE">
<CHOICES>
<CHOICE>Business/Career</CHOICE>
<CHOICE>Classes &amp; Lectures</CHOICE>
<CHOICE>Dinners/Galas</CHOICE>
<CHOICE>Fundraiser</CHOICE>
<CHOICE>Misc</CHOICE>
<CHOICE>Seminars</CHOICE>
<CHOICE>Support Groups</CHOICE>
</CHOICES>
</Field>
<Field ID="{2071EA0D-3F61-4de4-9A68-7C9C1047AC19}" Type="MultiChoice" Name="AudienceTypeField"
DisplayName="Audience Type" StaticName="AudienceTypeField" Hidden="FALSE" Required="TRUE" Sealed="FALSE">
<CHOICES>
<CHOICE>Adults</CHOICE>
<CHOICE>Everyones' Invited</CHOICE>
<CHOICE>Families</CHOICE>
<CHOICE>Kids</CHOICE>
<CHOICE>Men</CHOICE>
<CHOICE>Seniors</CHOICE>
<CHOICE>Singles</CHOICE>
<CHOICE>Teens</CHOICE>
<CHOICE>Women</CHOICE>
</CHOICES>
</Field>
</Elements>  3.部署完成后我们去“网站WebSite设置—网站WebSite内容类型库”中即可以看到下面是部分截图:

MOSS中创建自定义内容类型

  其中标题地点开始时间等都是由Event继承而来

  4.我们新创建个日历列表然后去“设置—列表设置—高级设置”中设置为允许管理内容类型如下图:

MOSS中创建自定义内容类型

  5.然后该日历列表设置面板里就会出现内容类型设置如下图:

MOSS中创建自定义内容类型

  6.我们点击“从现有网站WebSite内容类型添加”来把我们刚才自定义内容类型OnlineEvent添加进来并删除原来事件内容类型

  7.这时我们返回日历列表点击新建就会使用我们自定义内容类型来创建如下图“

MOSS中创建自定义内容类型

  8.如果现在我们创建OnlineEvent内容类型项目他会使用MOSS本身样式MOSS本身使用NewForm.aspx EditForm.aspxDispForm.aspx个页面都包含个ListFormWebPart接着我们就创建自定义新建编辑和显示页面OnlineEventAdd.aspxOnlineEventDisplay.aspxOnlineEventEdit.aspx分别对应新建显示和编辑页面相应.cs文件为他们后台代码文件

  我们在新建显示和编辑页面时他们产生URL是有定规律

  http://carysun/_layouts/ONLINEEVENT/OnlineEventAdd.aspx?List=22c18dec%2D33f7%2D42eb%2D9632%2D630384b99e52&RootFolder=%2FLists%2FCalendar&ContentTypeId=0x010200730061EB7D784BB786F4AC157702B8C70010F7F00BE575CB40AA1B113235A36982&Source=http%3A%2F%2Fcarysun%2FLists%2FCalendar%2Fcalendar%2Easpx

  主要包括以下几部分:

  List:列表id

  ID:这个条目ID

  Source: 返回URL

  我们使用SetValues思路方法来给相应item赋值,注意最后定要Update思路方法来更新

protected bool SetValues
{
   SPWeb web = SPContext.Current.Web;
   web.AllowUnsafeUpdates = true;
   SPListItem item = SPContext.Current.Item as SPListItem;
   (item != null)
   {
     (!Page.IsValid) false;
    item[FLD_TITLE] = txtTitle.Text;
    item[FLD_LOCATION] = txtLocation.Text;
    item[FLD_STARTTIME] = spDTStartTime.Value;
    item[FLD_ENDTIME] = spDTEndTime.Value;
    item[FLD_NUMBER_OF_ATTENDEES] = nfAttendees.Value;
    item[FLD_EVENTTYPE] = ddEventType.Value;
    item[FLD_AUDIENCETYPE] = ccAudienceType.Value;
    item[FLD_DESCRIPTION] = rhTxtDescription.Value;
    item[FLD_STATUS] = ddStatus.Value;
    item.Update;
  }
   true;
}
  具体代码请参考附件中源代码

  9.我们要在OnlineEvent.xml中添加如下设置来指定使用我们自定义页面:

<XmlDocument NamespaceURI="http://schemas.microsoft.com/sharepo/v3/contenttype/forms/url">
<FormUrls xmlns="http://schemas.microsoft.com/sharepo/v3/contenttype/forms/url">
<Edit>_layouts/ONLINEEVENT/OnlineEventEdit.aspx</Edit>
<New>_layouts/ONLINEEVENT/OnlineEventAdd.aspx</New>
<Display>_layouts/ONLINEEVENT/OnlineEventDisplay.aspx</Display>
</FormUrls>
</XmlDocument>
  10.填加EventHandler事件处理在新建和更新时候判断来保证该列表中项目标题不能重复我们需要重写ItemAdding和ItemUpdating代码如下:

public override void ItemAdding(SPItemEventProperties properties)
{
   using (SPSite site = SPSite(properties.WebUrl))
   {
     using (SPWeb web = site.OpenWeb)
     {
       SPList list = (web.Lists[properties.ListId]);
       theTitle = ()properties.AfterProperties["Title"];
       (findItemWithTitle(theTitle, -1, list))
       {
         properties.ErrorMessage =
                .Format("A title of {0} is already in use", theTitle);
         properties.Cancel = true;
       }
     }
   }
}
public override void ItemUpdating(SPItemEventProperties properties)
{
  SPListItem item = properties.ListItem;
  SPList list = item.ParentList;
   theTitle = ()properties.AfterProperties["Title"];
   (findItemWithTitle(theTitle, item.ID, list))
  {
    properties.ErrorMessage =
              .Format("A title of {0} is already in use", theTitle);
    properties.Cancel = true;
  }
}
private bool findItemWithTitle( title, id, SPList list)
{
   camlQuery = @"
       <Where> <And> <Eq> <FieldRef Name='LinkTitle' />
           <Value Type='Text'>{0}</Value></Eq><Neq>
           <FieldRef Name='ID' /><Value Type='Counter'>{1}
           </Value></Neq></And>
       </Where>";
   SPQuery query = SPQuery(list.DefaultView);
   query.Query = .Format(camlQuery, title, id);
   SPListItemCollection results = list.GetItems(query);
   (results.Count > 0);
}
  重新编译后OnlineEvent.xml中会自动填加如下部分:



<XmlDocument NamespaceURI="http://schemas.microsoft.com/sharepo/events">
<Receivers>
<Receiver>
<Name>ItemAdding</Name>
<Type>ItemAdding</Type>
<SequenceNumber>1</SequenceNumber>
<Class>5109fd1e-10f1-4f27-9448-b06dc140ec78</Class>
</Receiver>
<Receiver>
<Name>ItemUpdating</Name>
<Type>ItemUpdating</Type>
<SequenceNumber>1</SequenceNumber>
<Class>5109fd1e-10f1-4f27-9448-b06dc140ec78</Class>
</Receiver>
</Receivers>
</XmlDocument>
  成功部署后我们自定义页面如下图

MOSS中创建自定义内容类型

  如果我新建项目标题和现有冲突就会有如下提示:

MOSS中创建自定义内容类型



0

相关文章

读者评论

发表评论

  • 昵称:
  • 内容: