代码之家  ›  专栏  ›  技术社区  ›  Janis Veinbergs

有没有内置的方法来判断特定的URL是属于这个SPWeb还是其他SPWeb?

  •  0
  • Janis Veinbergs  · 技术社区  · 16 年前

    我有一个url列表(内容类型用法url)。现在,内容类型被部署在web上。我需要循环那些内容类型,并在每个列表中执行一些操作,但是每次循环都打开新的SPWeb实例太耗费资源了。

    例子:

    SPWeb可能

    内容类型使用链接如下:

    • /web2/列表/文档
    • /web2/子web1/列表/任务
    • ...

    如您所见,对于前3个用法,我不需要打开新的SPWeb

    3 回复  |  直到 16 年前
        1
  •  2
  •   naivists    16 年前

    只是猜测,但也许值得一试 SPWeb.GetList(serverRelativeUrl) 在你已经拥有的SPWeb实例上,如果没有匹配的,那么创建一个新的SPWeb?

    更新:另一个想法。假设所有spweb都位于同一SPSite中,那么您最好使用 this particular overload of SPSite.OpenWeb() (并将requestExactUrl标志设置为false)。这将返回所需的SPWeb对象。 SPWeb.SPWebConstructor 方法),所以这不会对性能造成太大影响。

        2
  •  1
  •   Paul Lucas    16 年前

    您的代码将在什么上下文中运行?

    如果是这样的话,代码是否针对性能进行了优化有关系吗?在我看来,最好还是坚持一个简单的解决方案,即打开每个SPWeb,而不要太担心性能。

    如果你需要在成百上千个站点上循环,这需要一些时间。不管你的代码需要10分钟,还是15分钟,都不重要。

    如果要运行多次并且经常运行,性能将是一个更大的问题。

        3
  •  0
  •   Magnus Johansson    16 年前

    据我所知,这种事情没有内在的方法。

    下面是一段代码片段,让您开始使用(未100%测试):

    public static class SPWebExtensions
    {
      public static bool UrlBelongsToweb(this SPWeb web, string url)
      {
        Uri uriWeb = new Uri(web.Url);
    
        if (uriWeb.LocalPath.ToLower() == url.ToLower())
          return true;
    
        if (!url.ToLower().StartsWith(uriWeb.LocalPath.ToLower()))
          return false;
    
        foreach (SPWeb subWeb in web.Webs)
        {
          Uri uriSub = new Uri(subWeb.Url);
          if (url.ToLower().StartsWith(uriSub.LocalPath.ToLower()))
            return false;
    
          subWeb.Dispose();
        }
        return true;
      }
    }
    

    你可以这样用它:

     bool urlBelongsToWeb = web.UrlBelongsToweb("/web2/Lists/Documents");
    

    其中web是您当前的SPWeb对象。

    SPSiteDataQuery