Như câu hỏi đã nói - có cách nào để xác định trang nào đang bao gồm phần web của tôi không?Sharepoint: làm thế nào tôi có thể tìm thấy tất cả các trang lưu trữ một phần web cụ thể?
Trả lời
Nếu bạn đang tìm kiếm mã, tôi có thứ gì đó cho bạn. Nếu bạn muốn tìm tất cả các phần web Query Nội dung thì bạn sẽ gọi mã của tôi như thế này:
FindWebPart("http://server.com/", "Microsoft.SharePoint.Publishing.WebControls.ContentByQueryWebPart");
Dưới đây là các mã:
public static void FindWebPart(string siteCollectionUrl, string webPartName)
{
using (SPSite siteCollection = new SPSite(siteCollectionUrl))
{
using (SPWeb rootSite = siteCollection.OpenWeb())
{
FindWebPartHelper(rootSite, webPartName);
}
}
}
public static void FindWebPartHelper(SPWeb site, string webPartName)
{
// Search for web part in Pages document library
SPList pagesList = null;
try
{
pagesList = site.Lists["Pages"];
}
catch (ArgumentException)
{
// List not found
}
if (null != pagesList)
{
SPListItemCollection pages = pagesList.Items;
foreach (SPListItem page in pages)
{
SPFile file = page.File;
using (SPLimitedWebPartManager mgr = file.GetLimitedWebPartManager(PersonalizationScope.Shared))
{
try
{
SPLimitedWebPartCollection webparts = mgr.WebParts;
foreach (System.Web.UI.WebControls.WebParts.WebPart wp in webparts)
{
// Here perform the webpart check
// For instance you could identify the web part by
// its class name
if (webPartName == wp.GetType().ToString())
{
// Found a match! Now do something...
Console.WriteLine("Found web part!");
}
}
}
finally
{
// Needs to be disposed
mgr.Web.Dispose();
}
}
}
}
// Check sub sites
SPWebCollection subSites = site.Webs;
foreach (SPWeb subSite in subSites)
{
try
{
FindWebPartHelper(subSite, webPartName);
}
finally
{
// Don't forget to dispose!
subSite.Dispose();
}
}
}
Ofcourse, bạn có thể thay đổi chút để mã này. Hiện tại nó có so sánh chuỗi, nhưng thật dễ dàng để thực hiện nó theo cách được đánh máy hơn. Chúc vui vẻ!
Bằng cách thay thế, nếu bạn muốn kiểm tra các trang phần web bao gồm các trang mặc định trên các trang web cộng tác, bạn có thể sử dụng đoạn mã sau đó sử dụng tài sản tập tin của đối tượng SPWeb:
private static void FindWebPart(string siteUrl, string webPartName)
{
using (var site = new SPSite(siteUrl))
{
foreach (SPWeb web in site.AllWebs)
{
foreach (var file in web.Files.Cast<SPFile>().Where(file => file.Name.EndsWith("aspx")))
{
FindWebPartOnPage(webPartName, file);
}
var pagesTemplateType = (SPListTemplateType)Enum.Parse(typeof(SPListTemplateType), "850");
foreach (var documentLibrary in web.Lists.Cast<SPList>().Where(list => list.BaseTemplate == pagesTemplateType || (list.BaseTemplate == SPListTemplateType.DocumentLibrary && list.Title.Contains("Pages"))))
{
foreach (var file in documentLibrary.Items.Cast<SPListItem>().Where(item => item.File.Name.EndsWith("aspx")).Select(item => item.File))
{
FindWebPartOnPage(webPartName, file);
}
}
web.Dispose();
}
}
}
private static void FindWebPartOnPage(string webPartName, SPFile file)
{
using (var webPartManager = file.GetLimitedWebPartManager(PersonalizationScope.Shared))
{
if (webPartManager.WebParts.Cast<WebPart>().Any(webPart => webPart.GetType().Name == webPartName))
{
Console.WriteLine(file.ServerRelativeUrl);
}
webPartManager.Web.Dispose();
}
}
Lưu ý: thư viện Pages được tạo bởi tính năng Publishing không có giá trị BaseTemplate của SPListTemplateType.DocumentLibrary; thay vào đó nó được đại diện bởi một giá trị "ẩn" của 850.
này được gọi một cách tương tự như câu trả lời LeonZandman, tuy nhiên chỉ có tên lớp được sử dụng để cung cấp cho một trận đấu:
FindWebPart("http://yoursite.com/", "MyWebPart");
vô địch, cảm ơn cho giúp đỡ – nailitdown
Rất vui được giúp đỡ :-) – LeonZandman
Nhân tiện, bạn có nên đánh dấu câu trả lời của mình là câu trả lời hay không bằng cách nhấp vào dấu kiểm? – LeonZandman