diff --git a/src/Umbraco.Core/Services/FileService.cs b/src/Umbraco.Core/Services/FileService.cs index 916c036a69..4428175fa9 100644 --- a/src/Umbraco.Core/Services/FileService.cs +++ b/src/Umbraco.Core/Services/FileService.cs @@ -291,6 +291,14 @@ namespace Umbraco.Core.Services {"ContentTypeAlias", contentTypeAlias}, }; + // check that the template hasn't been created on disk before creating the content type + // if it exists, set the new template content to the existing file content + string content = GetViewContent(contentTypeAlias); + if (content.IsNullOrWhiteSpace() == false) + { + template.Content = content; + } + using (var uow = UowProvider.GetUnitOfWork()) { var saveEventArgs = new SaveEventArgs(template, true, evtMsgs, additionalData); @@ -1045,6 +1053,19 @@ namespace Umbraco.Core.Services : Attempt.Fail(); } + internal Attempt TryGetViewPath(string fileName) + { + if (fileName.EndsWith(".cshtml") == false) + { + fileName += ".cshtml"; + } + + string viewPath = IOHelper.MapPath(SystemDirectories.MvcViews + "/" + fileName); + return System.IO.File.Exists(viewPath) + ? Attempt.Succeed(viewPath) + : Attempt.Fail(); + } + private IPartialViewRepository GetPartialViewRepository(PartialViewType partialViewType, IUnitOfWork uow) { switch (partialViewType) @@ -1076,6 +1097,23 @@ namespace Umbraco.Core.Services return GetPartialViewMacroSnippetContent(snippetName, PartialViewType.PartialViewMacro); } + public string GetViewContent(string filename) + { + if (filename.IsNullOrWhiteSpace()) + throw new ArgumentNullException(nameof(filename)); + + Attempt viewAttempt = TryGetViewPath(filename); + if (viewAttempt.Success == false) + { + return string.Empty; + } + + using (var view = new StreamReader(System.IO.File.OpenRead(viewAttempt.Result))) + { + return view.ReadToEnd().Trim(); + } + } + private string GetPartialViewMacroSnippetContent(string snippetName, PartialViewType partialViewType) { if (snippetName.IsNullOrWhiteSpace()) @@ -1265,4 +1303,4 @@ namespace Umbraco.Core.Services #endregion } -} \ No newline at end of file +} diff --git a/src/Umbraco.Core/Services/IFileService.cs b/src/Umbraco.Core/Services/IFileService.cs index 74de0861d8..0031562697 100644 --- a/src/Umbraco.Core/Services/IFileService.cs +++ b/src/Umbraco.Core/Services/IFileService.cs @@ -427,5 +427,12 @@ namespace Umbraco.Core.Services /// The filesystem path to the partial view. /// The size of the partial view. long GetPartialViewFileSize(string filepath); + + /// + /// Gets the content of a view. + /// + /// The name of the view. + /// + string GetViewContent(string filename); } -} \ No newline at end of file +} diff --git a/src/Umbraco.Web/Editors/TemplateController.cs b/src/Umbraco.Web/Editors/TemplateController.cs index 78855c95c2..3df6cb2aba 100644 --- a/src/Umbraco.Web/Editors/TemplateController.cs +++ b/src/Umbraco.Web/Editors/TemplateController.cs @@ -1,9 +1,12 @@ using System.Collections.Generic; +using System.IO; using System.Linq; using System.Net; using System.Net.Http; +using System.Web; using System.Web.Http; using AutoMapper; +using Umbraco.Core; using Umbraco.Core.IO; using Umbraco.Core.Models; using Umbraco.Core.Services; @@ -178,6 +181,14 @@ namespace Umbraco.Web.Editors else { //create + + // file might already be on disk, if so grab the content to avoid overwriting + string content = Services.FileService.GetViewContent(display.Alias); + if (string.IsNullOrEmpty(content) == false) + { + display.Content = content; + } + ITemplate master = null; if (string.IsNullOrEmpty(display.MasterTemplateAlias) == false) {