diff --git a/src/Umbraco.Core/Models/Content.cs b/src/Umbraco.Core/Models/Content.cs index dc86b5e3ce..d408cf9c2e 100644 --- a/src/Umbraco.Core/Models/Content.cs +++ b/src/Umbraco.Core/Models/Content.cs @@ -16,7 +16,7 @@ namespace Umbraco.Core.Models public class Content : ContentBase, IContent { private IContentType _contentType; - private int _templateId; + private int? _templateId; private bool _published; private PublishedState _publishedState; private DateTime? _releaseDate; @@ -84,7 +84,7 @@ namespace Umbraco.Core.Models // ReSharper disable once ClassNeverInstantiated.Local private class PropertySelectors { - public readonly PropertyInfo TemplateSelector = ExpressionHelper.GetPropertyInfo(x => x.TemplateId); + public readonly PropertyInfo TemplateSelector = ExpressionHelper.GetPropertyInfo(x => x.TemplateId); public readonly PropertyInfo PublishedSelector = ExpressionHelper.GetPropertyInfo(x => x.Published); public readonly PropertyInfo ReleaseDateSelector = ExpressionHelper.GetPropertyInfo(x => x.ReleaseDate); public readonly PropertyInfo ExpireDateSelector = ExpressionHelper.GetPropertyInfo(x => x.ExpireDate); @@ -100,7 +100,7 @@ namespace Umbraco.Core.Models /// the Default template from the ContentType will be returned. /// [DataMember] - public virtual int TemplateId + public virtual int? TemplateId { get => _templateId; set => SetPropertyValueAndDetectChanges(value, ref _templateId, Ps.Value.TemplateSelector); @@ -205,7 +205,7 @@ namespace Umbraco.Core.Models /// [IgnoreDataMember] - public int PublishTemplateId { get; internal set; } // set by persistence + public int? PublishTemplateId { get; internal set; } // set by persistence /// [IgnoreDataMember] diff --git a/src/Umbraco.Core/Models/IContent.cs b/src/Umbraco.Core/Models/IContent.cs index 3bb2e7d396..da0aa4a404 100644 --- a/src/Umbraco.Core/Models/IContent.cs +++ b/src/Umbraco.Core/Models/IContent.cs @@ -14,7 +14,7 @@ namespace Umbraco.Core.Models /// /// Gets or sets the template id used to render the content. /// - int TemplateId { get; set; } + int? TemplateId { get; set; } /// /// Gets a value indicating whether the content is published. @@ -42,7 +42,7 @@ namespace Umbraco.Core.Models /// Gets the template id used to render the published version of the content. /// /// When editing the content, the template can change, but this will not until the content is published. - int PublishTemplateId { get; } + int? PublishTemplateId { get; } /// /// Gets the name of the published version of the content. diff --git a/src/Umbraco.Core/Services/EntityXmlSerializer.cs b/src/Umbraco.Core/Services/EntityXmlSerializer.cs index a652776c95..3ba4b60b53 100644 --- a/src/Umbraco.Core/Services/EntityXmlSerializer.cs +++ b/src/Umbraco.Core/Services/EntityXmlSerializer.cs @@ -52,7 +52,7 @@ namespace Umbraco.Core.Services xml.Add(new XAttribute("writerName", content.GetWriterProfile(userService)?.Name ?? "??")); xml.Add(new XAttribute("writerID", content.WriterId)); - xml.Add(new XAttribute("template", content.TemplateId.ToString(CultureInfo.InvariantCulture))); + xml.Add(new XAttribute("template", content.TemplateId?.ToString(CultureInfo.InvariantCulture))); xml.Add(new XAttribute("isPublished", content.Published)); diff --git a/src/Umbraco.Tests/Models/ContentTests.cs b/src/Umbraco.Tests/Models/ContentTests.cs index 8cba508fa9..3f1ca0346b 100644 --- a/src/Umbraco.Tests/Models/ContentTests.cs +++ b/src/Umbraco.Tests/Models/ContentTests.cs @@ -426,19 +426,19 @@ namespace Umbraco.Tests.Models // Assert Assert.IsTrue(content.WasDirty()); - Assert.IsTrue(content.WasPropertyDirty("Id")); - Assert.IsTrue(content.WasPropertyDirty("CreateDate")); - Assert.IsTrue(content.WasPropertyDirty("CreatorId")); - Assert.IsTrue(content.WasPropertyDirty("ExpireDate")); - Assert.IsTrue(content.WasPropertyDirty("Key")); - Assert.IsTrue(content.WasPropertyDirty("Level")); - Assert.IsTrue(content.WasPropertyDirty("Path")); - Assert.IsTrue(content.WasPropertyDirty("ReleaseDate")); - Assert.IsTrue(content.WasPropertyDirty("SortOrder")); - Assert.IsTrue(content.WasPropertyDirty("Template")); - Assert.IsTrue(content.WasPropertyDirty("Trashed")); - Assert.IsTrue(content.WasPropertyDirty("UpdateDate")); - Assert.IsTrue(content.WasPropertyDirty("WriterId")); + Assert.IsTrue(content.WasPropertyDirty(nameof(Content.Id))); + Assert.IsTrue(content.WasPropertyDirty(nameof(Content.CreateDate))); + Assert.IsTrue(content.WasPropertyDirty(nameof(Content.CreatorId))); + Assert.IsTrue(content.WasPropertyDirty(nameof(Content.ExpireDate))); + Assert.IsTrue(content.WasPropertyDirty(nameof(Content.Key))); + Assert.IsTrue(content.WasPropertyDirty(nameof(Content.Level))); + Assert.IsTrue(content.WasPropertyDirty(nameof(Content.Path))); + Assert.IsTrue(content.WasPropertyDirty(nameof(Content.ReleaseDate))); + Assert.IsTrue(content.WasPropertyDirty(nameof(Content.SortOrder))); + Assert.IsTrue(content.WasPropertyDirty(nameof(Content.TemplateId))); + Assert.IsTrue(content.WasPropertyDirty(nameof(Content.Trashed))); + Assert.IsTrue(content.WasPropertyDirty(nameof(Content.UpdateDate))); + Assert.IsTrue(content.WasPropertyDirty(nameof(Content.WriterId))); foreach (var prop in content.Properties) { Assert.IsTrue(prop.WasDirty()); @@ -459,7 +459,6 @@ namespace Umbraco.Tests.Models Assert.IsTrue(culture.Value.WasPropertyDirty("Date")); } //verify child objects were reset too - Assert.Zero(content.TemplateId); Assert.IsTrue(content.ContentType.WasPropertyDirty("UpdateDate")); } diff --git a/src/Umbraco.Tests/Persistence/Repositories/DocumentRepositoryTest.cs b/src/Umbraco.Tests/Persistence/Repositories/DocumentRepositoryTest.cs index f48445fae0..7c5e10dc89 100644 --- a/src/Umbraco.Tests/Persistence/Repositories/DocumentRepositoryTest.cs +++ b/src/Umbraco.Tests/Persistence/Repositories/DocumentRepositoryTest.cs @@ -432,7 +432,8 @@ namespace Umbraco.Tests.Persistence.Repositories var fetched = repository.Get(textpage.Id); - Assert.NotZero(textpage.TemplateId); + Assert.True(textpage.TemplateId.HasValue); + Assert.NotZero(textpage.TemplateId.Value); Assert.AreEqual(textpage.TemplateId, contentType.DefaultTemplate.Id); scope.Complete(); @@ -562,7 +563,7 @@ namespace Umbraco.Tests.Persistence.Repositories var updatedContent = repository.Get(NodeDto.NodeIdSeed + 2); - Assert.Zero(updatedContent.TemplateId); + Assert.False(updatedContent.TemplateId.HasValue); } } diff --git a/src/Umbraco.Web/Models/Mapping/DefaultTemplateResolver.cs b/src/Umbraco.Web/Models/Mapping/DefaultTemplateResolver.cs index 32fc0c7ea0..12caf93681 100644 --- a/src/Umbraco.Web/Models/Mapping/DefaultTemplateResolver.cs +++ b/src/Umbraco.Web/Models/Mapping/DefaultTemplateResolver.cs @@ -14,7 +14,7 @@ namespace Umbraco.Web.Models.Mapping return null; // If no template id was set... - if (source.TemplateId == 0) + if (!source.TemplateId.HasValue) { // ... and no default template is set, return null... if (string.IsNullOrWhiteSpace(source.ContentType.DefaultTemplate?.Alias)) @@ -25,7 +25,7 @@ namespace Umbraco.Web.Models.Mapping } var fileService = DependencyResolver.Current.GetService(); - var template = fileService.GetTemplate(source.TemplateId); + var template = fileService.GetTemplate(source.TemplateId.Value); return template.Alias; } diff --git a/src/Umbraco.Web/umbraco.presentation/page.cs b/src/Umbraco.Web/umbraco.presentation/page.cs index b6fe51552b..b74d8c5602 100644 --- a/src/Umbraco.Web/umbraco.presentation/page.cs +++ b/src/Umbraco.Web/umbraco.presentation/page.cs @@ -357,7 +357,7 @@ namespace umbraco get { return _key; } } - public int TemplateId => _inner.TemplateId; + public int TemplateId => _inner.TemplateId ?? 0; public int SortOrder {