Обновление URL узла навигации в мхе программно - PullRequest
0 голосов
/ 21 сентября 2009

Может кто-нибудь понять, почему это не должно работать:

SPSite topNavigationSite = new SPSite("http://moss");
SPWeb topNavigationWeb = topNavigationSite.OpenWeb();
SPNavigationNodeCollection topNavigationBarNodes = topNavigationWeb.Navigation.TopNavigationBar;
SPNavigationNode updateNode = topNavigationBarNodes.Navigation.GetNodeByUrl("/about");
updateNode.Url = "";
topNavigationWeb.Update();

Я вижу отладку, в которой для URL-адреса установлено значение "", но при отображении страницы навигация по-прежнему отображает URL-адрес в виде /about/default.aspx

.

Я запускаю это в page_load и ожидал, что он обновит базу данных мха новым значением url.

Ответы [ 2 ]

1 голос
/ 27 июня 2013

Я знаю, что это 3 года! но так как нет места в Интернете об обновлении текущего URL!

Я должен был сделать некоторую отладку, и это то, что я придумал! Кстати, я получил подсказку от

topNavigationWeb.Update();

указывает на то, что обновляется список! Подсказка Подсказка!

немного фона! Я хотел обновить быстрые ссылки из списка, когда они добавляют, обновляют и удаляют элемент из списка! В моем списке есть два столбца Title и URL!

Затем я создал проект в VS 2010, его получатель событий, который подключен только к этому списку (сделано в файле elements.xml)

в файле .cs я добавил элемент, элемент удален (не удален;)) и элемент обновлен

публичное переопределение void ItemAdded (свойства SPItemEventProperties)

публичное переопределение void ItemUpdated (свойства SPItemEventProperties)

публичное переопределение void ItemDeleting (свойства SPItemEventProperties)

теперь внутри каждого метода вы можете просто вызвать этот метод!

добавление / обновление

   public static void AddQuickLaunchItem(string header, string url, SPWeb web)
   {
       SPNavigationNodeCollection quickLaunch = web.Navigation.QuickLaunch;

       // try to get quick launch header
       SPNavigationNode nodeHeader =
       quickLaunch.Cast<SPNavigationNode>().Where(n => n.Title == header).FirstOrDefault();

       //if header not found create it
       if (nodeHeader == null)
       {
           nodeHeader = quickLaunch.AddAsFirst(new SPNavigationNode(header, url,true));
       }
       else
       {

           web.AllowUnsafeUpdates = true;


           nodeHeader = quickLaunch.Cast<SPNavigationNode>().Where(n => n.Title == header).First() ;
           nodeHeader.Url = url;

           web.AllowUnsafeUpdates = false;
       }
       nodeHeader.Update();
       web.Update();
   }

первая часть проверяет, существует ли узел, используя заголовок (заголовок)! Я сравниваю между тем, какие заголовки есть, и из элемента списка:

SPNavigationNode nodeHeader =
           quickLaunch.Cast<SPNavigationNode>().Where(n => n.Title == header).FirstOrDefault();

эта часть сравнения:

n.Title == header

Я получаю эти значения (header и url / spweb) примерно так:

public static void AddQuickLaunchItem (заголовок строки, URL-адрес строки, веб-сайт SPWeb)

метод, который вызывает вышеупомянутое, будет выглядеть так:

   private void addloopweblinks(SPSite siteCollection, SPItemEventProperties properties)
   {
       // Enumerate through each site and apply branding.
       foreach (SPWeb web in siteCollection.AllWebs)
       {
           AddQuickLaunchItem(properties.ListItem["Title"].ToString(), properties.ListItem["URL"].ToString(), web);
       }
   }

и указанный выше метод вызывается в itemadded и ItemUpdated;), передавая значения следующим образом:

   public override void ItemAdded(SPItemEventProperties properties)
   {
           using (SPSite siteCollection = new SPSite(properties.WebUrl))
           {
               if (siteCollection != null)
               {
                       addloopweblinks(siteCollection, properties);
               }
           }
   }

аналогичные вещи можно сделать для удаления;)

SPNavigationNode nodeHeader = quickLaunch.Cast (). Где (n => заголовок n.Title ==) .FirstOrDefault ();

, который получит узел!

nodeHeader.delete (); nodeHeader.update ();

это удалит элемент!

так что в вашем случае, что вам нужно, я не знаю, заметили ли вы, что это была эта часть:

    web.AllowUnsafeUpdates = true;

    nodeHeader = quickLaunch.Cast<SPNavigationNode>().Where(n => n.Title == header).First() ;
    nodeHeader.Url = url;

    web.AllowUnsafeUpdates = false;

    nodeHeader.Update();
    web.Update();

как вы понимаете, что я подразумеваю под подсказкой! nodeHeader.Update (); не обновил URL-адрес, при отладке он меняется, но когда я перехожу к части обновления, она не работает :( и она щелкнула, мне нужно web.AllowUnsafeUpdates = true; loool только потому, что я сталкивался с подобной ситуацией раньше!

для вас это будет:

using(SPSite topNavigationSite = new SPSite("http://moss"))
{
  using(SPWeb topNavigationWeb = topNavigationSite.OpenWeb())
  {
     web.AllowUnsafeUpdates = true;
     SPNavigationNodeCollection topNavigationBarNodes =topNavigationWeb.Navigation.TopNavigationBar;
     SPNavigationNode updateNode = topNavigationBarNodes.Navigation.GetNodeByUrl("/about");
     updateNode.Url = "";
     updateNode.Update();
     web.Update();
     web.AllowUnsafeUpdates = false;
  }
}

Если пользователь не обладает достаточными правами, чем вам нужно инкапсулировать вышеупомянутое с runwithelevatedprivalages :), надеюсь, это поможет:)

0 голосов
/ 21 сентября 2009

Вы пробовали:

updateNode.Update();
topNavigationWeb.Update();

Не похоже, что вы обновляете объект SPNavigationNode. (Примечание: вам может не понадобиться второй вызов на обновление.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...