diff --git a/src/Umbraco.Core/IO/ViewHelper.cs b/src/Umbraco.Core/IO/ViewHelper.cs index 77b2d6cc99..569d8cdfc9 100644 --- a/src/Umbraco.Core/IO/ViewHelper.cs +++ b/src/Umbraco.Core/IO/ViewHelper.cs @@ -69,6 +69,7 @@ namespace Umbraco.Core.IO // either // @inherits Umbraco.Web.Mvc.UmbracoViewPage // @inherits Umbraco.Web.Mvc.UmbracoViewPage + content.AppendLine("@using Umbraco.Web.PublishedModels;"); content.Append("@inherits Umbraco.Web.Common.AspNetCore.UmbracoViewPage"); if (modelClassName.IsNullOrWhiteSpace() == false) { diff --git a/src/Umbraco.Infrastructure/Models/PublishedContent/PublishedModelFactory.cs b/src/Umbraco.Infrastructure/Models/PublishedContent/PublishedModelFactory.cs index 8be56850d1..e065ac17b7 100644 --- a/src/Umbraco.Infrastructure/Models/PublishedContent/PublishedModelFactory.cs +++ b/src/Umbraco.Infrastructure/Models/PublishedContent/PublishedModelFactory.cs @@ -12,11 +12,12 @@ namespace Umbraco.Core.Models.PublishedContent { private readonly Dictionary _modelInfos; private readonly Dictionary _modelTypeMap; + private readonly IPublishedValueFallback _publishedValueFallback; private class ModelInfo { public Type ParameterType { get; set; } - public Func Ctor { get; set; } + public Func Ctor { get; set; } public Type ModelType { get; set; } public Func ListCtor { get; set; } } @@ -35,7 +36,8 @@ namespace Umbraco.Core.Models.PublishedContent /// PublishedContentModelFactoryResolver.Current.SetFactory(factory); /// /// - public PublishedModelFactory(IEnumerable types) + public PublishedModelFactory(IEnumerable types, + IPublishedValueFallback publishedValueFallback) { var modelInfos = new Dictionary(StringComparer.InvariantCultureIgnoreCase); var modelTypeMap = new Dictionary(StringComparer.InvariantCultureIgnoreCase); @@ -52,7 +54,7 @@ namespace Umbraco.Core.Models.PublishedContent foreach (var ctor in type.GetConstructors()) { var parms = ctor.GetParameters(); - if (parms.Length == 1 && typeof(IPublishedElement).IsAssignableFrom(parms[0].ParameterType)) + if (parms.Length == 2 && typeof(IPublishedElement).IsAssignableFrom(parms[0].ParameterType) && typeof(IPublishedValueFallback).IsAssignableFrom(parms[1].ParameterType)) { if (constructor != null) throw new InvalidOperationException($"Type {type.FullName} has more than one public constructor with one argument of type, or implementing, IPublishedElement."); @@ -71,13 +73,14 @@ namespace Umbraco.Core.Models.PublishedContent throw new InvalidOperationException($"Both types '{type.AssemblyQualifiedName}' and '{modelInfo.ModelType.AssemblyQualifiedName}' want to be a model type for content type with alias \"{typeName}\"."); // have to use an unsafe ctor because we don't know the types, really - var modelCtor = ReflectionUtilities.EmitConstructorUnsafe>(constructor); + var modelCtor = ReflectionUtilities.EmitConstructorUnsafe>(constructor); modelInfos[typeName] = new ModelInfo { ParameterType = parameterType, ModelType = type, Ctor = modelCtor }; modelTypeMap[typeName] = type; } _modelInfos = modelInfos.Count > 0 ? modelInfos : null; _modelTypeMap = modelTypeMap; + _publishedValueFallback = publishedValueFallback; } /// @@ -95,7 +98,7 @@ namespace Umbraco.Core.Models.PublishedContent throw new InvalidOperationException($"Model {modelInfo.ModelType} expects argument of type {modelInfo.ParameterType.FullName}, but got {element.GetType().FullName}."); // can cast, because we checked when creating the ctor - return (IPublishedElement) modelInfo.Ctor(element); + return (IPublishedElement) modelInfo.Ctor(element, _publishedValueFallback); } /// diff --git a/src/Umbraco.ModelsBuilder.Embedded/Compose/ModelsBuilderComposer.cs b/src/Umbraco.ModelsBuilder.Embedded/Compose/ModelsBuilderComposer.cs index d1765d5a41..03b3b7425d 100644 --- a/src/Umbraco.ModelsBuilder.Embedded/Compose/ModelsBuilderComposer.cs +++ b/src/Umbraco.ModelsBuilder.Embedded/Compose/ModelsBuilderComposer.cs @@ -63,10 +63,11 @@ namespace Umbraco.ModelsBuilder.Embedded.Compose composition.RegisterUnique(factory => { var typeLoader = factory.GetInstance(); + var publishedValueFallback = factory.GetInstance(); var types = typeLoader .GetTypes() // element models .Concat(typeLoader.GetTypes()); // content models - return new PublishedModelFactory(types); + return new PublishedModelFactory(types, publishedValueFallback); }); } diff --git a/src/Umbraco.ModelsBuilder.Embedded/PureLiveModelFactory.cs b/src/Umbraco.ModelsBuilder.Embedded/PureLiveModelFactory.cs index 807a05a786..fe3b53daa6 100644 --- a/src/Umbraco.ModelsBuilder.Embedded/PureLiveModelFactory.cs +++ b/src/Umbraco.ModelsBuilder.Embedded/PureLiveModelFactory.cs @@ -291,7 +291,6 @@ namespace Umbraco.ModelsBuilder.Embedded GC.Collect(); GC.WaitForPendingFinalizers(); } - // We must create a new assembly load context // as long as theres a reference to the assembly load context we can't delete the assembly it loaded