利用Module 创建 SharePoint List View
SharePoint 如何给 LIST 增加或者修改视图呢?
首先创建一个Views的Module
<?xml version="1.0" encoding="utf-8"?> <Elements xmlns="http://schemas.microsoft.com/sharepoint/"> <Module Name="Views"> <File Path="Views\Views.xml" Url="Views.xml" Type="Ghostable"/> </Module> <Module Name="Views" > <File Path="Views\Elements.xml" Url="Elements_$SharePoint.Feature.Id$.xml" Type="Ghostable" /> </Module> </Elements>
这里Elements_$SharePoint.Feature.Id$.xml用法可以参照 http://www.cnblogs.com/SharePointGuy/archive/2012/03/19/2407194.html
创建一个VIEWs的XML文件
<?xml version="1.0" encoding="utf-8" ?> <Views> <View Name="{8A3B11DF-46D7-43C5-A40C-72903FCEE515}" Type="HTML"
DisplayName
="InviteeDetailCustomView"
ListTitle
="Invitees" Url="/sites/msracc/Lists/Invitees/InviteeDetailCustomView.aspx" Level="1" BaseViewID="1" ContentTypeID="0x" ImageUrl="/_layouts/images/generic.png"> <Query /> <ViewFields>
<FieldRef Name="Title" /> <FieldRef Name="FieldInternalName" />
</ViewFields>
<RowLimit Paged="TRUE">2147483647</RowLimit>
</View>
</Views>
这里可以扩展多个FieldRefs,视图的顺序按照FieldRef的排列顺序显示。
然后用一个FEATURE将这个文件部署到一个指定的LIST 并创建相应的视图。
1: public override void FeatureDeactivating(SPFeatureReceiverProperties properties)
2: {
3: string featureID = properties.Feature.DefinitionId.ToString();
4: string pattern = string.Format(@"^.+_{0}.xml$", featureID);
5: var files = SPContext.Current.Site.RootWeb.RootFolder.Files.Cast<SPFile>().Where(f => Regex.IsMatch(f.Name, pattern));
6: var deleteFiles = files.Select(f => f.Name);
7: foreach (SPFile file in files)
8: {
9: XElement xElement = GetRequestFile(file);
10: XNamespace xns = XNamespace.Get("http://schemas.microsoft.com/sharepoint/");
11: var names = xElement.Elements(XName.Get("Module", xns.NamespaceName)).SelectMany(ma => ma.Elements(XName.Get("File", xns.NamespaceName)).Where(f => !f.Attribute("Url").Value.Contains(featureID)).Select(f => f.Attribute("Url").Value));
12: foreach (var name in names)
13: {
14: SPFile f = SPContext.Current.Site.RootWeb.GetFile(name);
15: if (f != null && f.Exists)
16: {
17: f.Delete();
18: }
19: }
20: }
21: foreach (var f in deleteFiles)
22: {
23: SPFile spfile = SPContext.Current.Site.RootWeb.GetFile(f);
24: spfile.Delete();
25: }
26:
27: SPContext.Current.Site.RootWeb.Update();
28: }
29: public override void FeatureActivated(SPFeatureReceiverProperties properties)
30: {
31: string featureID = properties.Feature.DefinitionId.ToString();
32: string pattern = string.Format(@"^.+_{0}.xml$", featureID);
33: var files = SPContext.Current.Site.RootWeb.RootFolder.Files.Cast<SPFile>().Where(f => Regex.IsMatch(f.Name, pattern));
34:
35: foreach (SPFile file in files)
36: {
37: XElement xElement = GetRequestFile(file);
38: XNamespace xns = XNamespace.Get("http://schemas.microsoft.com/sharepoint/");
39: var names = xElement.Elements(XName.Get("Module", xns.NamespaceName)).SelectMany(ma => ma.Elements(XName.Get("File", xns.NamespaceName)).Where(f => !f.Attribute("Url").Value.Contains(featureID)).Select(f => f.Attribute("Url").Value));
40: foreach (var name in names)
41: {
42: UpdateOrAddView(SPContext.Current.Site.RootWeb, name);
43: }
44: }
45: }
46:
47: private void UpdateOrAddView(SPWeb web, string fileName)
48: {
49: SPFile file = web.RootFolder.Files.Cast<SPFile>().Where(f => f.Name.Equals(fileName)).FirstOrDefault();
50: if (file != null && file.Exists)
51: {
52: XElement element = GetRequestFile(file);
53: element.Elements().Where(e => e.Name.ToString().Equals("View")).ToList().ForEach(li => UpdateOrAddView(web, li));
54: }
55: }
56:
57: private XElement GetRequestFile(SPFile file)
58: {
59: XmlReader r = XmlReader.Create(file.OpenBinaryStream());
60: XElement element = XElement.Load(r);
61: return element;
62: }
63:
64: private void UpdateOrAddView(SPWeb web, XElement li)
65: {
66: var list = web.Lists.TryGetList(li.Attribute("ListTitle").Value);
67: var fieldRefs = GetFieldsStringCollection(li);
68: var rowLimit = uint.Parse(li.Element("RowLimit").Value);
69: var isPaged = Boolean.Parse(li.Element("RowLimit").Attribute("Paged").Value);
70: var viewDisplayName = li.Attribute("DisplayName").Value;
71: if (list != null)
72: {
73: SPView view = list.Views.Cast<SPView>().Where(v => v.Title.Equals(viewDisplayName)).FirstOrDefault();
74: if (view != null)
75: {
76: //// Update view
77: view.ViewFields.DeleteAll();
78: view.RowLimit = rowLimit;
79: view.Paged = isPaged;
80:
81: foreach (var f in fieldRefs)
82: {
83: view.ViewFields.Add(f);
84: }
85: view.Update();
86: }
87: else
88: {
89: /// Add view
90: list.Views.Add(viewDisplayName,
91: fieldRefs,
92: string.Empty,
93: rowLimit,
94: isPaged,
95: false
96: );
97: list.Update();
98: }
99: }
100: }
101: private System.Collections.Specialized.StringCollection GetFieldsStringCollection(XElement li)
102: {
103: var stringCollection = new System.Collections.Specialized.StringCollection();
104: var fieldRefs = li.Descendants("FieldRef");
105: if (fieldRefs != null)
106: {
107: foreach (var f in fieldRefs)
108: {
109: stringCollection.Add(f.Attribute("Name").Value);
110: }
111: }
112: return stringCollection;
113: }
这样视图就可以和LIST通过FEATURE 来进行一个关联了。