2014-02-26 41 views

回答

1

您可以創建一個事件處理程序,在創建新節點時更改節點的排序順序。有關實現您自己的處理程序的更多詳細信息,請參見Application startup events & event registration

粗糙未經測試的例子,我相信你可以做更多的優雅,但應該指向你在正確的方向:

public class YourApplicationEventHandlerClassName : ApplicationEventHandler 
{ 
    protected override void ApplicationStarted(UmbracoApplicationBase umbracoApplication, ApplicationContext applicationContext) 
    { 
     ContentService.Created += ContentServiceCreated; 
    } 

    private void ContentServiceCreated(IContentService sender, NewEventArgs<IContent> e) 
    { 
     var cs = ApplicationContext.Current.Services.ContentService; 
     var content = e.Entity; 
     var parentNode = content.Parent(); 

     content.SortOrder = parentNode.Children().OrderBy(n => n.SortOrder).First().SortOrder - 1; 
     cs.Save(content); 
    } 
} 
+0

除上面的例子你最好先檢查父節點是否有子節點,否則你會得到一個空引用異常。 – ProNotion

+0

謝謝你。但是什麼時候該函數會被執行?我沒有在您提供的鏈接的任何地方看到ContentServiceCreated? – Aximili

+0

您不會在文檔中找到它,因爲EventHandlers的實現取決於您,您以與其他任何事件相同的方式訂閱它們。我用更完整的例子更新了我的答案。如事件名稱所示,在創建ANY節點時執行。 – ProNotion

1

ContentService.Created事件並沒有爲我工作。採取了一些戰鬥,但在Umbracov7,我已經使用了ContentService.Saved事件代替,用髒性能有一定的雙重檢查,以確保您在節省無限循環不結束:

private void ContentSaved(IContentService sender, SaveEventArgs<IContent> e) 
    { 
     foreach (var content in e.SavedEntities) 
     { 
      var dirty = (IRememberBeingDirty)content; 
      var isNew = dirty.WasPropertyDirty("Id"); 
      if (!isNew) return; 

      var parentNode = content.Parent(); 
      if (parentNode == null) return; 
      var last = parentNode.Children().OrderBy(n => n.SortOrder).FirstOrDefault(); 
      if (last != null) 
      { 
       content.SortOrder = last.SortOrder - 1; 
       if (content.Published) 
        sender.SaveAndPublishWithStatus(content); 
       else 
        sender.Save(content); 
      } 
     } 
    } 

public class AppStartupHandler : ApplicationEventHandler 
{ 
    protected override void ApplicationInitialized(UmbracoApplicationBase umbracoApplication, 
     ApplicationContext applicationContext) 
    { 
     ContentService.Saved += ContentSaved; 
    } 
}