我正在使用SPAudit,我有一个未知类型的对象。对象为Site
时,Here是答案。但是对象可以是this enum中的任何类型。
我正在寻找获取GUID并返回指定对象的url的方法。类似的东西:
static string GetUrlByGuid(Guid guid)
{
var item = SPFarm.Local.GetObject(guid);
if (item == null)
return null;
return item.ToString(); //return item.Url or something like it
}
答案 0 :(得分:2)
您可以利用SPAuditEntry.DocLocation Property在审核事件发生时获取审核对象的位置。
实施例
var query = new SPAuditQuery(site);
query.SetRangeStart(DateTime.Now.AddHours(-36));
var entries = site.Audit.GetEntries(query);
foreach (SPAuditEntry entry in entries)
{
Console.WriteLine(entry.DocLocation);
}
答案 1 :(得分:0)
我的解决方案确实不是很好,bcs对于列表和listitems它需要位置字符串(来自SPAudit的DocLocation属性)。但至少,它有效。
private static string GetUrlByGuid(Guid guid, SPAuditItemType type, string location)
{
switch (type)
{
case SPAuditItemType.Site:
return SPContext.Current.Site.Url;
case SPAuditItemType.Web:
try
{
using (var site = new SPSite(SPContext.Current.Site.ID))
using (var web = site.OpenWeb(guid))
{
return web.Url;
}
}
catch (FileNotFoundException)
{
return string.Empty;
}
case SPAuditItemType.List:
{
if (string.IsNullOrEmpty(location))
throw new ArgumentNullException("location");
using (var site = new SPSite(SPContext.Current.Site.Url + "/" + location))
{
using (var web = site.OpenWeb())
{
try
{
return web.Lists[guid].DefaultViewUrl;
}
catch (SPException)
{
return string.Empty;
}
}
}
}
case SPAuditItemType.ListItem:
var match = ListItemRegex.Match(location);
string listUrl = match.Groups[1].Value.Trim('/');
using (var site = new SPSite(SPContext.Current.Site.Url + "/" + location))
using (var web = site.OpenWeb())
{
foreach (SPList list in web.Lists)
{
if (list.RootFolder.ServerRelativeUrl.Trim('/') == listUrl)
{
return string.Format("{0}?ID={1}",
SPUtility.ConcatUrls(web.Url, list.Forms[PAGETYPE.PAGE_DISPLAYFORM].Url),
match.Groups[2].Value);
}
}
}
return string.Empty;
case SPAuditItemType.Document:
return SPContext.Current.Site.Url + "/" + location;
default:
return string.Empty;
}
}
private static readonly Regex ListItemRegex = new Regex(@"(.+?)(\d+)_.000", RegexOptions.Compiled);