回复:MOSS中创建自定义内容类型

赞助商
四:创建自定义内容类型

1. 我们创建一个基于Event类型的自定义内容类型,项目结构如下图:
附件: ct3_thumb.jpg


2. OnlineEvent.xml文件是内容类型的定义文件,每一个Field节点代表不同的网站栏,FieldRef节点代表网站栏在该内容类型中的引用。我们定义了四个网站栏分别为Status Field,Number Of Attendees,Event Type,Audience Type。具体代码如下:
  1. <?xml version="1.0" encoding="utf-8"?>

  2. <Elements Id="5f0c1259-87bc-4d63-bfc8-6f4997ec3f20" xmlns="http://schemas.microsoft.com/sharepoint/">
  3. <ContentType ID="0x010200730061eb7d784bb786f4ac157702b8c7" Name="OnlineEvent" Group="Development" Description="Developing Content Type" Version="0">
  4. <FieldRefs>
  5. <FieldRef ID="{5FCA124E-66FD-4e70-B3CE-D4B7C97D8A0E}" Name="StatusField" DisplayName="Status Field" Required="TRUE" />
  6. <FieldRef ID="{9451F129-78A1-47f0-8CA5-AB7F0D51902C}" Name="NumberOfAttendeesField" DisplayName="Number Of Attendees" Required="FALSE" />
  7. <FieldRef ID="{63DF93F8-B6E8-4c66-A1CB-66C1E677AF45}" Name="EventTypeField" DisplayName="Event Type" Required="TRUE" />
  8. <FieldRef ID="{2071EA0D-3F61-4de4-9A68-7C9C1047AC19}" Name="AudienceTypeField" DisplayName="Audience Type" Required="TRUE" />
  9. </FieldRefs>
  10. </ContentType>
  11. <Field ID="{5FCA124E-66FD-4e70-B3CE-D4B7C97D8A0E}" Type="Choice" Name="StatusField" DisplayName="Status" StaticName="StatusField" Hidden="FALSE" Required="TRUE" Sealed="FALSE">
  12. <CHOICES>
  13. <CHOICE>None</CHOICE>
  14. <CHOICE>Approved </CHOICE>
  15. <CHOICE>Rejected</CHOICE>
  16. </CHOICES>
  17. <Default>None</Default>
  18. </Field>
  19. <Field ID="{9451F129-78A1-47f0-8CA5-AB7F0D51902C}" Type="Number" Name="NumberOfAttendeesField" DisplayName="Number Of Attendees" StaticName="NumberOfAttendeesField" Hidden="FALSE" Required="FALSE" Sealed="FALSE" />
  20. <Field ID="{63DF93F8-B6E8-4c66-A1CB-66C1E677AF45}" Type="Choice" Name="EventTypeField"DisplayName="Event Type" StaticName="EventTypeField" Hidden="FALSE" Required="TRUE" Sealed="FALSE">
  21. <CHOICES>
  22. <CHOICE>Business/Career</CHOICE>
  23. <CHOICE>Classes & Lectures</CHOICE>
  24. <CHOICE>Dinners/Galas</CHOICE>
  25. <CHOICE>Fundraiser</CHOICE>
  26. <CHOICE>Misc</CHOICE>
  27. <CHOICE>Seminars</CHOICE>
  28. <CHOICE>Support Groups</CHOICE>
  29. </CHOICES>
  30. </Field>
  31. <Field ID="{2071EA0D-3F61-4de4-9A68-7C9C1047AC19}" Type="MultiChoice" Name="AudienceTypeField"DisplayName="Audience Type" StaticName="AudienceTypeField" Hidden="FALSE" Required="TRUE" Sealed="FALSE">
  32. <CHOICES>
  33. <CHOICE>Adults</CHOICE>
  34. <CHOICE>Everyones' Invited</CHOICE>
  35. <CHOICE>Families</CHOICE>
  36. <CHOICE>Kids</CHOICE>
  37. <CHOICE>Men</CHOICE>
  38. <CHOICE>Seniors</CHOICE>
  39. <CHOICE>Singles</CHOICE>
  40. <CHOICE>Teens</CHOICE>
  41. <CHOICE>Women</CHOICE>
  42. </CHOICES>
  43. </Field>
  44. </Elements>
复制代码
3.部署完成后我们去“网站设置—网站内容类型库”中即可以看到,下面是部分截图:
附件: ct4_thumb.jpg


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

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


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


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

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


8.如果现在我们创建OnlineEvent内容类型的项目他会使用MOSS本身的样式,MOSS本身使用NewForm.aspx ,EditForm.aspx,DispForm.aspx。每一个页面都包含一个ListFormWebPart。接着我们就创建自定义的新建,编辑和显示页面,OnlineEventAdd.aspx,OnlineEventDisplay.aspx,OnlineEventEdit.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方法来更新。
  1. protected bool SetValues()
  2. {
  3.     SPWeb web = SPContext.Current.Web;
  4.     web.AllowUnsafeUpdates = true;
  5.     SPListItem item = SPContext.Current.Item as SPListItem;

  6.     if (item != null)
  7.     {
  8.         if (!Page.IsValid) return false;
  9.         item[FLD_TITLE] = txtTitle.Text;
  10.         item[FLD_LOCATION] = txtLocation.Text;
  11.         item[FLD_STARTTIME] = spDTStartTime.Value;
  12.         item[FLD_ENDTIME] = spDTEndTime.Value;
  13.         item[FLD_NUMBER_OF_ATTENDEES] = nfAttendees.Value;
  14.         item[FLD_EVENTTYPE] = ddEventType.Value;
  15.         item[FLD_AUDIENCETYPE] = ccAudienceType.Value;
  16.         item[FLD_DESCRIPTION] = rhTxtDescription.Value;
  17.         item[FLD_STATUS] = ddStatus.Value;
  18.         item.Update();
  19.     }
  20.     return true;
  21. }
复制代码
具体的代码请参考附件中的源代码。

9.我们要在OnlineEvent.xml中添加如下设置来指定使用我们自定义的页面:
  1. <XmlDocument NamespaceURI="http://schemas.microsoft.com/sharepoint/v3/contenttype/forms/url">
  2. <FormUrls xmlns="http://schemas.microsoft.com/sharepoint/v3/contenttype/forms/url">
  3. <Edit>_layouts/ONLINEEVENT/OnlineEventEdit.aspx</Edit>
  4. <New>_layouts/ONLINEEVENT/OnlineEventAdd.aspx</New>
  5. <Display>_layouts/ONLINEEVENT/OnlineEventDisplay.aspx</Display>
  6. </FormUrls>
  7. </XmlDocument>
复制代码
10.填加EventHandler事件处理程序,在新建和更新的时候判断来保证该列表中的项目标题不能重复,我们需要重写ItemAdding和ItemUpdating,代码如下:
  1. public override void ItemAdding(SPItemEventProperties properties)
  2. {
  3.     using (SPSite site = new SPSite(properties.WebUrl))
  4.     {
  5.         using (SPWeb web = site.OpenWeb())
  6.         {
  7.             SPList list = (web.Lists[properties.ListId]);
  8.             string theTitle = (string)properties.AfterProperties["Title"];
  9.             if (findItemWithTitle(theTitle, -1, list))
  10.             {
  11.                 properties.ErrorMessage =
  12.                               string.Format("A title of {0} is already in use", theTitle);
  13.                 properties.Cancel = true;
  14.             }
  15.         }
  16.     }
  17. }

  18. public override void ItemUpdating(SPItemEventProperties properties)
  19. {
  20.     SPListItem item = properties.ListItem;
  21.     SPList list = item.ParentList;
  22.     string theTitle = (string)properties.AfterProperties["Title"];
  23.     if (findItemWithTitle(theTitle, item.ID, list))
  24.     {
  25.       properties.ErrorMessage =
  26.                             string.Format("A title of {0} is already in use", theTitle);
  27.       properties.Cancel = true;
  28.     }

  29. }

  30. private bool findItemWithTitle(string title, int id, SPList list)
  31. {
  32.     string camlQuery = @"
  33.               <Where> <And> <Eq> <FieldRef Name='LinkTitle' />
  34.                       <Value Type='Text'>{0}</Value></Eq><Neq>
  35.                       <FieldRef Name='ID' /><Value Type='Counter'>{1}</Value></Neq></And>
  36.               </Where>";
  37.     SPQuery query = new SPQuery(list.DefaultView);
  38.     query.Query = string.Format(camlQuery, title, id);
  39.     SPListItemCollection results = list.GetItems(query);
  40.     return (results.Count > 0);

  41. }
复制代码
重新编译后OnlineEvent.xml中会自动填加如下部分:
  1. <XmlDocument NamespaceURI="http://schemas.microsoft.com/sharepoint/events">
  2. <Receivers>
  3. <Receiver>
  4. <Name>ItemAdding</Name>
  5. <Type>ItemAdding</Type>
  6. <SequenceNumber>1</SequenceNumber>
  7. <Class>5109fd1e-10f1-4f27-9448-b06dc140ec78</Class>
  8. </Receiver>
  9. <Receiver>
  10. <Name>ItemUpdating</Name>
  11. <Type>ItemUpdating</Type>
  12. <SequenceNumber>1</SequenceNumber>
  13. <Class>5109fd1e-10f1-4f27-9448-b06dc140ec78</Class>
  14. </Receiver>
  15. </Receivers>
  16. </XmlDocument>
复制代码
成功部署后我们自定义的页面如下图
附件: ct8_thumb.jpg


如果我新建的项目的标题和现有的冲突就会有如下提示:
附件: ct9_thumb.jpg


代码下载:
赞助商
赞助商
TOP