diff --git a/build/NuSpecs/UmbracoCms.Core.nuspec b/build/NuSpecs/UmbracoCms.Core.nuspec
index 9758c05dd6..88281cb84b 100644
--- a/build/NuSpecs/UmbracoCms.Core.nuspec
+++ b/build/NuSpecs/UmbracoCms.Core.nuspec
@@ -15,31 +15,35 @@
en-US
umbraco
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/build/NuSpecs/UmbracoCms.Web.nuspec b/build/NuSpecs/UmbracoCms.Web.nuspec
index fabd1e25a8..c52c8831e0 100644
--- a/build/NuSpecs/UmbracoCms.Web.nuspec
+++ b/build/NuSpecs/UmbracoCms.Web.nuspec
@@ -15,30 +15,35 @@
en-US
umbraco
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/build/NuSpecs/UmbracoCms.nuspec b/build/NuSpecs/UmbracoCms.nuspec
index b0f30b9779..5e6dccfcd8 100644
--- a/build/NuSpecs/UmbracoCms.nuspec
+++ b/build/NuSpecs/UmbracoCms.nuspec
@@ -15,18 +15,25 @@
en-US
umbraco
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Umbraco.Core/Configuration/GlobalSettings.cs b/src/Umbraco.Core/Configuration/GlobalSettings.cs
index e30bf85fd0..02b26aec86 100644
--- a/src/Umbraco.Core/Configuration/GlobalSettings.cs
+++ b/src/Umbraco.Core/Configuration/GlobalSettings.cs
@@ -31,7 +31,7 @@ namespace Umbraco.Core.Configuration
private static string _reservedPaths;
private static string _reservedUrls;
//ensure the built on (non-changeable) reserved paths are there at all times
- internal const string StaticReservedPaths = "~/app_plugins/,~/install/,"; //must end with a comma!
+ internal const string StaticReservedPaths = "~/app_plugins/,~/install/,~/mini-profiler-resources/,"; //must end with a comma!
internal const string StaticReservedUrls = "~/config/splashes/noNodes.aspx,~/.well-known,"; //must end with a comma!
#endregion
diff --git a/src/Umbraco.Core/Persistence/DbConnectionExtensions.cs b/src/Umbraco.Core/Persistence/DbConnectionExtensions.cs
index 20586cb6f4..835f76f9f9 100644
--- a/src/Umbraco.Core/Persistence/DbConnectionExtensions.cs
+++ b/src/Umbraco.Core/Persistence/DbConnectionExtensions.cs
@@ -76,7 +76,7 @@ namespace Umbraco.Core.Persistence
do
{
c = unwrapped;
- if (unwrapped is ProfiledDbConnection profiled) unwrapped = profiled.InnerConnection;
+ if (unwrapped is ProfiledDbConnection profiled) unwrapped = profiled.WrappedConnection;
if (unwrapped is RetryDbConnection retrying) unwrapped = retrying.Inner;
} while (c != unwrapped);
diff --git a/src/Umbraco.Core/Persistence/NPocoDatabaseExtensions.cs b/src/Umbraco.Core/Persistence/NPocoDatabaseExtensions.cs
index 248f91284f..bb4c60a0df 100644
--- a/src/Umbraco.Core/Persistence/NPocoDatabaseExtensions.cs
+++ b/src/Umbraco.Core/Persistence/NPocoDatabaseExtensions.cs
@@ -148,7 +148,7 @@ namespace Umbraco.Core.Persistence
where TConnection : class, IDbConnection
{
var profiled = connection as ProfiledDbConnection;
- return profiled == null ? connection as TConnection : profiled.InnerConnection as TConnection;
+ return profiled == null ? connection as TConnection : profiled.WrappedConnection as TConnection;
}
///
diff --git a/src/Umbraco.Core/Umbraco.Core.csproj b/src/Umbraco.Core/Umbraco.Core.csproj
index f773d5d152..b80d607d4f 100755
--- a/src/Umbraco.Core/Umbraco.Core.csproj
+++ b/src/Umbraco.Core/Umbraco.Core.csproj
@@ -55,25 +55,25 @@
-
-
+
+
2.2.2
- 5.2.6
+ 5.2.7
- 4.0.0
+ 4.0.1
-
-
+
+
- 2.7.1
+ 2.8.0
2.0.1
@@ -88,7 +88,7 @@
1.0.0
- 1.0.2
+ 1.0.3
2.2.2
diff --git a/src/Umbraco.Examine/Umbraco.Examine.csproj b/src/Umbraco.Examine/Umbraco.Examine.csproj
index 1320f3b0d2..989afd8d1c 100644
--- a/src/Umbraco.Examine/Umbraco.Examine.csproj
+++ b/src/Umbraco.Examine/Umbraco.Examine.csproj
@@ -49,7 +49,7 @@
-
+
diff --git a/src/Umbraco.Tests/App.config b/src/Umbraco.Tests/App.config
index 5e366eef33..49de625450 100644
--- a/src/Umbraco.Tests/App.config
+++ b/src/Umbraco.Tests/App.config
@@ -64,23 +64,23 @@
-
+
-
+
-
+
-
+
-
-
+
+
@@ -88,7 +88,7 @@
-
+
@@ -100,11 +100,11 @@
-
+
-
+
diff --git a/src/Umbraco.Tests/Models/Mapping/AutoMapper6Tests.cs b/src/Umbraco.Tests/Models/Mapping/AutoMapper6Tests.cs
index 59c514f654..18bceaae49 100644
--- a/src/Umbraco.Tests/Models/Mapping/AutoMapper6Tests.cs
+++ b/src/Umbraco.Tests/Models/Mapping/AutoMapper6Tests.cs
@@ -121,16 +121,16 @@ namespace Umbraco.Tests.Models.Mapping
break;
case 1:
map
- .ForMember(dest => dest.ValueString, opt => opt.ResolveUsing(src => src.ValueString));
+ .ForMember(dest => dest.ValueString, opt => opt.MapFrom(src => src.ValueString));
break;
case 2:
map
- .ForMember(dest => dest.ValueString, opt => opt.ResolveUsing());
+ .ForMember(dest => dest.ValueString, opt => opt.MapFrom());
break;
case 3:
// in most cases that should be perfectly enough?
map
- .ForMember(dest => dest.ValueString, opt => opt.ResolveUsing(source => "!!" + source.ValueString + "!!"));
+ .ForMember(dest => dest.ValueString, opt => opt.MapFrom(source => "!!" + source.ValueString + "!!"));
break;
default:
throw new ArgumentOutOfRangeException(nameof(ver));
diff --git a/src/Umbraco.Tests/TestHelpers/Stubs/TestProfiler.cs b/src/Umbraco.Tests/TestHelpers/Stubs/TestProfiler.cs
index 0ffcfb7a3f..39cac6e24f 100644
--- a/src/Umbraco.Tests/TestHelpers/Stubs/TestProfiler.cs
+++ b/src/Umbraco.Tests/TestHelpers/Stubs/TestProfiler.cs
@@ -33,15 +33,20 @@ namespace Umbraco.Tests.TestHelpers.Stubs
{
if (_enabled == false) return;
- MiniProfiler.Settings.SqlFormatter = new SqlServerFormatter();
- MiniProfiler.Settings.StackMaxLength = 5000;
- MiniProfiler.Start();
+ //see https://miniprofiler.com/dotnet/AspDotNet
+ MiniProfiler.Configure(new MiniProfilerOptions
+ {
+ SqlFormatter = new SqlServerFormatter(),
+ StackMaxLength = 5000,
+ });
+
+ MiniProfiler.StartNew();
}
public void Stop(bool discardResults = false)
{
if (_enabled)
- MiniProfiler.Stop(discardResults);
+ MiniProfiler.Current.Stop(discardResults);
}
}
}
diff --git a/src/Umbraco.Tests/Umbraco.Tests.csproj b/src/Umbraco.Tests/Umbraco.Tests.csproj
index 3bfc3387fe..e88aa5ae61 100644
--- a/src/Umbraco.Tests/Umbraco.Tests.csproj
+++ b/src/Umbraco.Tests/Umbraco.Tests.csproj
@@ -78,40 +78,39 @@
-
-
+
+
- 1.8.9
+ 1.8.14
-
+
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
-
-
+
+
-
-
-
+
+
+
-
+
-
-
+
diff --git a/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj b/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj
index f12ccfcf99..3658ef7066 100644
--- a/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj
+++ b/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj
@@ -83,7 +83,7 @@
-
+
@@ -91,19 +91,19 @@
-
-
+
+
all
-
-
-
-
-
+
+
+
+
+
8.0.0-alpha.37
diff --git a/src/Umbraco.Web.UI/web.Template.Debug.config b/src/Umbraco.Web.UI/web.Template.Debug.config
index 8c4b3bb299..ff42f098f7 100644
--- a/src/Umbraco.Web.UI/web.Template.Debug.config
+++ b/src/Umbraco.Web.UI/web.Template.Debug.config
@@ -25,4 +25,73 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Umbraco.Web.UI/web.Template.config b/src/Umbraco.Web.UI/web.Template.config
index d93089fe21..f0abbfde52 100644
--- a/src/Umbraco.Web.UI/web.Template.config
+++ b/src/Umbraco.Web.UI/web.Template.config
@@ -215,23 +215,23 @@
-
+
-
+
-
+
-
+
-
+
@@ -239,16 +239,20 @@
-
+
-
+
+
+
+
+
diff --git a/src/Umbraco.Web/Editors/EntityController.cs b/src/Umbraco.Web/Editors/EntityController.cs
index 55604e0eb9..d89909d793 100644
--- a/src/Umbraco.Web/Editors/EntityController.cs
+++ b/src/Umbraco.Web/Editors/EntityController.cs
@@ -14,6 +14,7 @@ using System.Reflection;
using Umbraco.Core.Models;
using Umbraco.Core.Persistence.DatabaseModelDefinitions;
using System.Web.Http.Controllers;
+using System.Web.Http.ModelBinding;
using Umbraco.Core.Cache;
using Umbraco.Core.Configuration;
using Umbraco.Core.Logging;
@@ -605,8 +606,7 @@ namespace Umbraco.Web.Editors
}
}
- [HttpQueryStringFilter("queryStrings")]
- public IEnumerable GetAncestors(int id, UmbracoEntityTypes type, FormDataCollection queryStrings)
+ public IEnumerable GetAncestors(int id, UmbracoEntityTypes type, [ModelBinder(typeof(HttpQueryStringModelBinder))]FormDataCollection queryStrings)
{
return GetResultForAncestors(id, type, queryStrings);
}
diff --git a/src/Umbraco.Web/Logging/WebProfiler.cs b/src/Umbraco.Web/Logging/WebProfiler.cs
index e31ef75209..14c1bb065f 100755
--- a/src/Umbraco.Web/Logging/WebProfiler.cs
+++ b/src/Umbraco.Web/Logging/WebProfiler.cs
@@ -11,6 +11,9 @@ namespace Umbraco.Web.Logging
///
/// Implements by using the MiniProfiler framework.
///
+ ///
+ /// Profiling only runs when the app is in debug mode, see WebRuntime for how this gets created
+ ///
internal class WebProfiler : IProfiler
{
private const string BootRequestItemKey = "Umbraco.Core.Logging.WebProfiler__isBootRequest";
@@ -22,10 +25,13 @@ namespace Umbraco.Web.Logging
// create our own provider, which can provide a profiler even during boot
_provider = new WebProfilerProvider();
- // settings
- MiniProfiler.Settings.SqlFormatter = new SqlServerFormatter();
- MiniProfiler.Settings.StackMaxLength = 5000;
- MiniProfiler.Settings.ProfilerProvider = _provider;
+ //see https://miniprofiler.com/dotnet/AspDotNet
+ MiniProfiler.Configure(new MiniProfilerOptions
+ {
+ SqlFormatter = new SqlServerFormatter(),
+ StackMaxLength = 5000,
+ ProfilerProvider = _provider
+ });
}
public void UmbracoApplicationBeginRequest(object sender, EventArgs e)
@@ -68,29 +74,32 @@ namespace Umbraco.Web.Logging
///
public string Render()
{
- return MiniProfiler.RenderIncludes(RenderPosition.Right).ToString();
+ return MiniProfiler.Current.RenderIncludes(RenderPosition.Right).ToString();
}
///
public IDisposable Step(string name)
{
- return MiniProfiler.Current.Step(name);
+ return MiniProfiler.Current?.Step(name);
}
///
public void Start()
{
- MiniProfiler.Start();
+ MiniProfiler.StartNew();
}
///
public void Stop(bool discardResults = false)
{
- MiniProfiler.Stop(discardResults);
+ MiniProfiler.Current?.Stop(discardResults);
}
private static Attempt TryGetRequest(object sender)
{
+ if (sender is HttpRequest httpRequest)
+ return Attempt.Succeed(new HttpRequestWrapper(httpRequest));
+
var app = sender as HttpApplication;
if (app == null) return Attempt.Fail();
diff --git a/src/Umbraco.Web/Logging/WebProfilerProvider.cs b/src/Umbraco.Web/Logging/WebProfilerProvider.cs
index 7b12c2f5bd..dbb81cf232 100755
--- a/src/Umbraco.Web/Logging/WebProfilerProvider.cs
+++ b/src/Umbraco.Web/Logging/WebProfilerProvider.cs
@@ -2,6 +2,7 @@
using System.Threading;
using System.Web;
using StackExchange.Profiling;
+using StackExchange.Profiling.Internal;
namespace Umbraco.Web.Logging
{
@@ -13,7 +14,7 @@ namespace Umbraco.Web.Logging
/// Once the boot phase is changed to BootPhase.BootRequest then the base class (default) provider will handle all
/// profiling data and this sub class no longer performs any logic.
///
- internal class WebProfilerProvider : WebRequestProfilerProvider
+ internal class WebProfilerProvider : AspNetRequestProvider
{
private readonly ReaderWriterLockSlim _locker = new ReaderWriterLockSlim();
private MiniProfiler _startupProfiler;
@@ -81,23 +82,16 @@ namespace Umbraco.Web.Logging
/// - assuming profiling is enabled, on every BeginRequest that should be profiled,
/// - except for the very first one which is the boot request.
///
- public override MiniProfiler Start(string sessionName = null)
+ public override MiniProfiler Start(string profilerName, MiniProfilerBaseOptions options)
{
var first = Interlocked.Exchange(ref _first, 1) == 0;
- if (first == false) return base.Start(sessionName);
+ if (first == false) return base.Start(profilerName, options);
- _startupProfiler = new MiniProfiler("http://localhost/umbraco-startup") { Name = "StartupProfiler" };
- SetProfilerActive(_startupProfiler);
+ _startupProfiler = new MiniProfiler("StartupProfiler", options);
+ CurrentProfiler = _startupProfiler;
return _startupProfiler;
}
- // obsolete but that's the one that's called ;-(
- [Obsolete]
- public override MiniProfiler Start(ProfileLevel level, string sessionName = null)
- {
- return Start(sessionName);
- }
-
///
/// Gets the current profiler.
///
@@ -105,23 +99,27 @@ namespace Umbraco.Web.Logging
/// If the boot phase is not Booted, then this will return the startup profiler (this), otherwise
/// returns the base class
///
- public override MiniProfiler GetCurrentProfiler()
+ public override MiniProfiler CurrentProfiler
{
- // if not booting then just use base (fast)
- // no lock, _bootPhase is volatile
- if (_bootPhase == BootPhase.Booted)
- return base.GetCurrentProfiler();
+ get
+ {
+ // if not booting then just use base (fast)
+ // no lock, _bootPhase is volatile
+ if (_bootPhase == BootPhase.Booted)
+ return base.CurrentProfiler;
- // else
- try
- {
- var current = base.GetCurrentProfiler();
- return current ?? _startupProfiler;
- }
- catch
- {
- return _startupProfiler;
+ // else
+ try
+ {
+ var current = base.CurrentProfiler;
+ return current ?? _startupProfiler;
+ }
+ catch
+ {
+ return _startupProfiler;
+ }
}
+
}
}
}
diff --git a/src/Umbraco.Web/Models/Mapping/CodeFileMapperProfile.cs b/src/Umbraco.Web/Models/Mapping/CodeFileMapperProfile.cs
index b3f5f0374c..563935676f 100644
--- a/src/Umbraco.Web/Models/Mapping/CodeFileMapperProfile.cs
+++ b/src/Umbraco.Web/Models/Mapping/CodeFileMapperProfile.cs
@@ -14,7 +14,7 @@ namespace Umbraco.Web.Models.Mapping
.ForMember(dest => dest.Alias, opt => opt.MapFrom(sheet => sheet.Alias))
.ForMember(dest => dest.Key, opt => opt.MapFrom(sheet => sheet.Key))
.ForMember(dest => dest.Name, opt => opt.MapFrom(sheet => sheet.Name))
- .ForMember(dest => dest.ParentId, opt => opt.UseValue(-1))
+ .ForMember(dest => dest.ParentId, opt => opt.MapFrom(_ => -1))
.ForMember(dest => dest.Path, opt => opt.MapFrom(sheet => sheet.Path))
.ForMember(dest => dest.Trashed, opt => opt.Ignore())
.ForMember(dest => dest.AdditionalData, opt => opt.Ignore())
diff --git a/src/Umbraco.Web/Models/Mapping/ContentMapperProfile.cs b/src/Umbraco.Web/Models/Mapping/ContentMapperProfile.cs
index 55b1672b2b..652ac12014 100644
--- a/src/Umbraco.Web/Models/Mapping/ContentMapperProfile.cs
+++ b/src/Umbraco.Web/Models/Mapping/ContentMapperProfile.cs
@@ -41,53 +41,53 @@ namespace Umbraco.Web.Models.Mapping
//FROM IContent TO ContentItemDisplay
CreateMap()
.ForMember(dest => dest.Udi, opt => opt.MapFrom(src => Udi.Create(src.Blueprint ? Constants.UdiEntityType.DocumentBlueprint : Constants.UdiEntityType.Document, src.Key)))
- .ForMember(dest => dest.Owner, opt => opt.ResolveUsing(src => contentOwnerResolver.Resolve(src)))
- .ForMember(dest => dest.Updater, opt => opt.ResolveUsing(src => creatorResolver.Resolve(src)))
- .ForMember(dest => dest.Variants, opt => opt.ResolveUsing(variantResolver))
- .ForMember(dest => dest.ContentApps, opt => opt.ResolveUsing(contentAppResolver))
+ .ForMember(dest => dest.Owner, opt => opt.MapFrom(src => contentOwnerResolver.Resolve(src)))
+ .ForMember(dest => dest.Updater, opt => opt.MapFrom(src => creatorResolver.Resolve(src)))
+ .ForMember(dest => dest.Variants, opt => opt.MapFrom(variantResolver))
+ .ForMember(dest => dest.ContentApps, opt => opt.MapFrom(contentAppResolver))
.ForMember(dest => dest.Icon, opt => opt.MapFrom(src => src.ContentType.Icon))
.ForMember(dest => dest.ContentTypeAlias, opt => opt.MapFrom(src => src.ContentType.Alias))
.ForMember(dest => dest.ContentTypeName, opt => opt.MapFrom(src => src.ContentType.Name))
.ForMember(dest => dest.IsContainer, opt => opt.MapFrom(src => src.ContentType.IsContainer))
.ForMember(dest => dest.IsElement, opt => opt.MapFrom(src => src.ContentType.IsElement))
.ForMember(dest => dest.IsBlueprint, opt => opt.MapFrom(src => src.Blueprint))
- .ForMember(dest => dest.IsChildOfListView, opt => opt.ResolveUsing(childOfListViewResolver))
+ .ForMember(dest => dest.IsChildOfListView, opt => opt.MapFrom(childOfListViewResolver))
.ForMember(dest => dest.Trashed, opt => opt.MapFrom(src => src.Trashed))
- .ForMember(dest => dest.TemplateAlias, opt => opt.ResolveUsing(defaultTemplateResolver))
- .ForMember(dest => dest.Urls, opt => opt.ResolveUsing(contentUrlResolver))
+ .ForMember(dest => dest.TemplateAlias, opt => opt.MapFrom(defaultTemplateResolver))
+ .ForMember(dest => dest.Urls, opt => opt.MapFrom(contentUrlResolver))
.ForMember(dest => dest.AllowPreview, opt => opt.Ignore())
- .ForMember(dest => dest.TreeNodeUrl, opt => opt.ResolveUsing(contentTreeNodeUrlResolver))
+ .ForMember(dest => dest.TreeNodeUrl, opt => opt.MapFrom(contentTreeNodeUrlResolver))
.ForMember(dest => dest.Notifications, opt => opt.Ignore())
.ForMember(dest => dest.Errors, opt => opt.Ignore())
- .ForMember(dest => dest.DocumentType, opt => opt.ResolveUsing(contentTypeBasicResolver))
- .ForMember(dest => dest.AllowedTemplates, opt => opt.ResolveUsing(allowedTemplatesResolver))
- .ForMember(dest => dest.AllowedActions, opt => opt.ResolveUsing(src => actionButtonsResolver.Resolve(src)))
+ .ForMember(dest => dest.DocumentType, opt => opt.MapFrom(contentTypeBasicResolver))
+ .ForMember(dest => dest.AllowedTemplates, opt => opt.MapFrom(allowedTemplatesResolver))
+ .ForMember(dest => dest.AllowedActions, opt => opt.MapFrom(src => actionButtonsResolver.Resolve(src)))
.ForMember(dest => dest.AdditionalData, opt => opt.Ignore());
CreateMap()
.ForMember(dest => dest.PublishDate, opt => opt.MapFrom(src => src.PublishDate))
- .ForMember(dest => dest.ReleaseDate, opt => opt.ResolveUsing(schedPublishReleaseDateResolver))
- .ForMember(dest => dest.ExpireDate, opt => opt.ResolveUsing(schedPublishExpireDateResolver))
+ .ForMember(dest => dest.ReleaseDate, opt => opt.MapFrom(schedPublishReleaseDateResolver))
+ .ForMember(dest => dest.ExpireDate, opt => opt.MapFrom(schedPublishExpireDateResolver))
.ForMember(dest => dest.Segment, opt => opt.Ignore())
.ForMember(dest => dest.Language, opt => opt.Ignore())
.ForMember(dest => dest.Notifications, opt => opt.Ignore())
- .ForMember(dest => dest.State, opt => opt.ResolveUsing>())
- .ForMember(dest => dest.Tabs, opt => opt.ResolveUsing(tabsAndPropertiesResolver));
+ .ForMember(dest => dest.State, opt => opt.MapFrom>())
+ .ForMember(dest => dest.Tabs, opt => opt.MapFrom(tabsAndPropertiesResolver));
//FROM IContent TO ContentItemBasic
CreateMap>()
.ForMember(dest => dest.Udi, opt => opt.MapFrom(src =>
Udi.Create(src.Blueprint ? Constants.UdiEntityType.DocumentBlueprint : Constants.UdiEntityType.Document, src.Key)))
- .ForMember(dest => dest.Owner, opt => opt.ResolveUsing(src => contentOwnerResolver.Resolve(src)))
- .ForMember(dest => dest.Updater, opt => opt.ResolveUsing(src => creatorResolver.Resolve(src)))
+ .ForMember(dest => dest.Owner, opt => opt.MapFrom(src => contentOwnerResolver.Resolve(src)))
+ .ForMember(dest => dest.Updater, opt => opt.MapFrom(src => creatorResolver.Resolve(src)))
.ForMember(dest => dest.Icon, opt => opt.MapFrom(src => src.ContentType.Icon))
.ForMember(dest => dest.Trashed, opt => opt.MapFrom(src => src.Trashed))
.ForMember(dest => dest.ContentTypeAlias, opt => opt.MapFrom(src => src.ContentType.Alias))
.ForMember(dest => dest.Alias, opt => opt.Ignore())
.ForMember(dest => dest.AdditionalData, opt => opt.Ignore())
- .ForMember(dest => dest.UpdateDate, opt => opt.ResolveUsing())
- .ForMember(dest => dest.Name, opt => opt.ResolveUsing())
- .ForMember(dest => dest.State, opt => opt.ResolveUsing>())
+ .ForMember(dest => dest.UpdateDate, opt => opt.MapFrom())
+ .ForMember(dest => dest.Name, opt => opt.MapFrom())
+ .ForMember(dest => dest.State, opt => opt.MapFrom>())
.ForMember(dest => dest.VariesByCulture, opt => opt.MapFrom(src => src.ContentType.VariesByCulture()));
//FROM IContent TO ContentPropertyCollectionDto
diff --git a/src/Umbraco.Web/Models/Mapping/ContentPropertyMapperProfile.cs b/src/Umbraco.Web/Models/Mapping/ContentPropertyMapperProfile.cs
index 0b086afb2d..f9ed72fc11 100644
--- a/src/Umbraco.Web/Models/Mapping/ContentPropertyMapperProfile.cs
+++ b/src/Umbraco.Web/Models/Mapping/ContentPropertyMapperProfile.cs
@@ -22,7 +22,7 @@ namespace Umbraco.Web.Models.Mapping
//FROM Property TO ContentPropertyBasic
CreateMap>()
.ForMember(tab => tab.Label, expression => expression.MapFrom(@group => @group.Name))
- .ForMember(tab => tab.IsActive, expression => expression.UseValue(true))
+ .ForMember(tab => tab.IsActive, expression => expression.MapFrom(_ => true))
.ForMember(tab => tab.Properties, expression => expression.Ignore())
.ForMember(tab => tab.Alias, expression => expression.Ignore())
.ForMember(tab => tab.Expanded, expression => expression.Ignore());
diff --git a/src/Umbraco.Web/Models/Mapping/ContentTypeMapperProfile.cs b/src/Umbraco.Web/Models/Mapping/ContentTypeMapperProfile.cs
index 88bf409737..ee78c692ff 100644
--- a/src/Umbraco.Web/Models/Mapping/ContentTypeMapperProfile.cs
+++ b/src/Umbraco.Web/Models/Mapping/ContentTypeMapperProfile.cs
@@ -153,7 +153,7 @@ namespace Umbraco.Web.Models.Mapping
CreateMap()
- .ConstructUsing(propertyTypeBasic =>
+ .ConstructUsing((propertyTypeBasic, context) =>
{
var dataType = dataTypeService.GetDataType(propertyTypeBasic.DataTypeId);
if (dataType == null) throw new NullReferenceException("No data type found with id " + propertyTypeBasic.DataTypeId);
@@ -168,7 +168,7 @@ namespace Umbraco.Web.Models.Mapping
.ForMember(dest => dest.PropertyEditorAlias, opt => opt.Ignore())
.ForMember(dest => dest.DeleteDate, opt => opt.Ignore())
- .ForMember(dto => dto.Variations, opt => opt.ResolveUsing())
+ .ForMember(dto => dto.Variations, opt => opt.MapFrom())
//only map if it is actually set
.ForMember(dest => dest.Id, opt => opt.Condition(source => source.Id > 0))
diff --git a/src/Umbraco.Web/Models/Mapping/ContentTypeProfileExtensions.cs b/src/Umbraco.Web/Models/Mapping/ContentTypeProfileExtensions.cs
index 0e324c94b9..d05295a546 100644
--- a/src/Umbraco.Web/Models/Mapping/ContentTypeProfileExtensions.cs
+++ b/src/Umbraco.Web/Models/Mapping/ContentTypeProfileExtensions.cs
@@ -114,7 +114,7 @@ namespace Umbraco.Web.Models.Mapping
.ForMember(dest => dest.Notifications, opt => opt.Ignore())
.ForMember(dest => dest.Errors, opt => opt.Ignore())
.ForMember(dest => dest.LockedCompositeContentTypes, opt => opt.Ignore())
- .ForMember(dest => dest.Groups, opt => opt.ResolveUsing(src => propertyGroupDisplayResolver.Resolve(src)));
+ .ForMember(dest => dest.Groups, opt => opt.MapFrom(src => propertyGroupDisplayResolver.Resolve(src)));
}
public static IMappingExpression MapBaseContentTypeEntityToDisplay(
@@ -129,7 +129,7 @@ namespace Umbraco.Web.Models.Mapping
var propertyTypeGroupResolver = new PropertyTypeGroupResolver(propertyEditors, dataTypeService);
return mapping
- .ForMember(dest => dest.Udi, opt => opt.ResolveUsing(src => contentTypeUdiResolver.Resolve(src)))
+ .ForMember(dest => dest.Udi, opt => opt.MapFrom(src => contentTypeUdiResolver.Resolve(src)))
.ForMember(dest => dest.Notifications, opt => opt.Ignore())
.ForMember(dest => dest.Blueprints, opt => opt.Ignore())
.ForMember(dest => dest.Errors, opt => opt.Ignore())
@@ -140,8 +140,8 @@ namespace Umbraco.Web.Models.Mapping
.ForMember(dest => dest.AllowedContentTypes, opt => opt.MapFrom(src => src.AllowedContentTypes.Select(x => x.Id.Value)))
.ForMember(dest => dest.CompositeContentTypes, opt => opt.MapFrom(src => src.ContentTypeComposition))
- .ForMember(dest => dest.LockedCompositeContentTypes, opt => opt.ResolveUsing(src => lockedCompositionsResolver.Resolve(src)))
- .ForMember(dest => dest.Groups, opt => opt.ResolveUsing(src => propertyTypeGroupResolver.Resolve(src)))
+ .ForMember(dest => dest.LockedCompositeContentTypes, opt => opt.MapFrom(src => lockedCompositionsResolver.Resolve(src)))
+ .ForMember(dest => dest.Groups, opt => opt.MapFrom(src => propertyTypeGroupResolver.Resolve(src)))
.ForMember(dest => dest.AdditionalData, opt => opt.Ignore());
}
@@ -184,7 +184,7 @@ namespace Umbraco.Web.Models.Mapping
// ignore for members
mapping = typeof(TDestination) == typeof(IMemberType)
? mapping.ForMember(dto => dto.Variations, opt => opt.Ignore())
- : mapping.ForMember(dto => dto.Variations, opt => opt.ResolveUsing>());
+ : mapping.ForMember(dto => dto.Variations, opt => opt.MapFrom>());
mapping = mapping
.ForMember(
diff --git a/src/Umbraco.Web/Models/Mapping/DataTypeMapperProfile.cs b/src/Umbraco.Web/Models/Mapping/DataTypeMapperProfile.cs
index 425e447c9c..f707003ffe 100644
--- a/src/Umbraco.Web/Models/Mapping/DataTypeMapperProfile.cs
+++ b/src/Umbraco.Web/Models/Mapping/DataTypeMapperProfile.cs
@@ -68,8 +68,8 @@ namespace Umbraco.Web.Models.Mapping
CreateMap()
.ForMember(dest => dest.Udi, opt => opt.MapFrom(src => Udi.Create(Constants.UdiEntityType.DataType, src.Key)))
- .ForMember(dest => dest.AvailableEditors, opt => opt.ResolveUsing(src => availablePropertyEditorsResolver.Resolve(src)))
- .ForMember(dest => dest.PreValues, opt => opt.ResolveUsing(src => configurationDisplayResolver.Resolve(src)))
+ .ForMember(dest => dest.AvailableEditors, opt => opt.MapFrom(src => availablePropertyEditorsResolver.Resolve(src)))
+ .ForMember(dest => dest.PreValues, opt => opt.MapFrom(src => configurationDisplayResolver.Resolve(src)))
.ForMember(dest => dest.SelectedEditor, opt => opt.MapFrom(src => src.EditorAlias.IsNullOrWhiteSpace() ? null : src.EditorAlias))
.ForMember(dest => dest.HasPrevalues, opt => opt.Ignore())
.ForMember(dest => dest.Notifications, opt => opt.Ignore())
@@ -92,13 +92,13 @@ namespace Umbraco.Web.Models.Mapping
.ConvertUsing(src => configurationDisplayResolver.Resolve(src));
CreateMap()
- .ConstructUsing(src => new DataType(propertyEditors[src.EditorAlias]) {CreateDate = DateTime.Now})
+ .ConstructUsing(src => new DataType(propertyEditors[src.EditorAlias], -1) {CreateDate = DateTime.Now})
.IgnoreEntityCommonProperties()
.ForMember(dest => dest.Id, opt => opt.MapFrom(src => Convert.ToInt32(src.Id)))
.ForMember(dest => dest.Key, opt => opt.Ignore()) // ignore key, else resets UniqueId - U4-3911
.ForMember(dest => dest.Path, opt => opt.Ignore())
.ForMember(dest => dest.EditorAlias, opt => opt.MapFrom(src => src.EditorAlias))
- .ForMember(dest => dest.DatabaseType, opt => opt.ResolveUsing(src => databaseTypeResolver.Resolve(src)))
+ .ForMember(dest => dest.DatabaseType, opt => opt.MapFrom(src => databaseTypeResolver.Resolve(src)))
.ForMember(dest => dest.CreatorId, opt => opt.Ignore())
.ForMember(dest => dest.Level, opt => opt.Ignore())
.ForMember(dest => dest.SortOrder, opt => opt.Ignore())
@@ -107,14 +107,14 @@ namespace Umbraco.Web.Models.Mapping
//Converts a property editor to a new list of pre-value fields - used when creating a new data type or changing a data type with new pre-vals
CreateMap>()
- .ConvertUsing(src =>
+ .ConvertUsing((dataEditor, configurationFieldDisplays) =>
{
// this is a new data type, initialize default configuration
// get the configuration editor,
// get the configuration fields and map to UI,
// get the configuration default values and map to UI
- var configurationEditor = src.GetConfigurationEditor();
+ var configurationEditor = dataEditor.GetConfigurationEditor();
var fields = configurationEditor.Fields.Select(Mapper.Map).ToArray();
diff --git a/src/Umbraco.Web/Models/Mapping/EntityMapperProfile.cs b/src/Umbraco.Web/Models/Mapping/EntityMapperProfile.cs
index 90e98822b1..ab3929166f 100644
--- a/src/Umbraco.Web/Models/Mapping/EntityMapperProfile.cs
+++ b/src/Umbraco.Web/Models/Mapping/EntityMapperProfile.cs
@@ -25,7 +25,7 @@ namespace Umbraco.Web.Models.Mapping
var contentTypeUdiResolver = new ContentTypeUdiResolver();
CreateMap()
- .ForMember(dest => dest.Name, opt => opt.ResolveUsing())
+ .ForMember(dest => dest.Name, opt => opt.MapFrom())
.ForMember(dest => dest.Udi, opt => opt.MapFrom(src => Udi.Create(ObjectTypes.GetUdiType(src.NodeObjectType), src.Key)))
.ForMember(dest => dest.Icon, opt => opt.MapFrom(src => GetContentTypeIcon(src)))
.ForMember(dest => dest.Trashed, opt => opt.MapFrom(src => src.Trashed))
@@ -42,17 +42,17 @@ namespace Umbraco.Web.Models.Mapping
CreateMap()
.ForMember(dest => dest.Udi, opt => opt.Ignore())
- .ForMember(dest => dest.Icon, opt => opt.UseValue("icon-box"))
- .ForMember(dest => dest.Path, opt => opt.UseValue(""))
- .ForMember(dest => dest.ParentId, opt => opt.UseValue(-1))
+ .ForMember(dest => dest.Icon, opt => opt.MapFrom(_ => "icon-box"))
+ .ForMember(dest => dest.Path, opt => opt.MapFrom(_ => ""))
+ .ForMember(dest => dest.ParentId, opt => opt.MapFrom(_ => -1))
.ForMember(dest => dest.Trashed, opt => opt.Ignore())
.ForMember(dest => dest.AdditionalData, opt => opt.Ignore());
CreateMap()
.ForMember(dest => dest.Udi, opt => opt.Ignore())
- .ForMember(dest => dest.Icon, opt => opt.UseValue("icon-tab"))
- .ForMember(dest => dest.Path, opt => opt.UseValue(""))
- .ForMember(dest => dest.ParentId, opt => opt.UseValue(-1))
+ .ForMember(dest => dest.Icon, opt => opt.MapFrom(_ => "icon-tab"))
+ .ForMember(dest => dest.Path, opt => opt.MapFrom(_ => ""))
+ .ForMember(dest => dest.ParentId, opt => opt.MapFrom(_ => -1))
//in v6 the 'alias' is it's lower cased name so we'll stick to that.
.ForMember(dest => dest.Alias, opt => opt.MapFrom(src => src.Name.ToLowerInvariant()))
.ForMember(dest => dest.Trashed, opt => opt.Ignore())
@@ -60,18 +60,18 @@ namespace Umbraco.Web.Models.Mapping
CreateMap()
.ForMember(dest => dest.Udi, opt => opt.Ignore())
- .ForMember(dest => dest.Icon, opt => opt.UseValue("icon-user"))
- .ForMember(dest => dest.Path, opt => opt.UseValue(""))
- .ForMember(dest => dest.ParentId, opt => opt.UseValue(-1))
+ .ForMember(dest => dest.Icon, opt => opt.MapFrom(_ => "icon-user"))
+ .ForMember(dest => dest.Path, opt => opt.MapFrom(_ => ""))
+ .ForMember(dest => dest.ParentId, opt => opt.MapFrom(_ => -1))
.ForMember(dest => dest.Alias, opt => opt.MapFrom(src => src.Username))
.ForMember(dest => dest.Trashed, opt => opt.Ignore())
.ForMember(dest => dest.AdditionalData, opt => opt.Ignore());
CreateMap()
.ForMember(dest => dest.Udi, opt => opt.MapFrom(src => Udi.Create(Constants.UdiEntityType.Template, src.Key)))
- .ForMember(dest => dest.Icon, opt => opt.UseValue("icon-layout"))
+ .ForMember(dest => dest.Icon, opt => opt.MapFrom(_ => "icon-layout"))
.ForMember(dest => dest.Path, opt => opt.MapFrom(src => src.Path))
- .ForMember(dest => dest.ParentId, opt => opt.UseValue(-1))
+ .ForMember(dest => dest.ParentId, opt => opt.MapFrom(_ => -1))
.ForMember(dest => dest.Trashed, opt => opt.Ignore())
.ForMember(dest => dest.AdditionalData, opt => opt.Ignore());
@@ -80,7 +80,7 @@ namespace Umbraco.Web.Models.Mapping
.ForMember(dest => dest.SortOrder, opt => opt.Ignore());
CreateMap()
- .ForMember(dest => dest.Udi, opt => opt.ResolveUsing(src => contentTypeUdiResolver.Resolve(src)))
+ .ForMember(dest => dest.Udi, opt => opt.MapFrom(src => contentTypeUdiResolver.Resolve(src)))
.ForMember(dest => dest.Path, opt => opt.MapFrom(src => src.Path))
.ForMember(dest => dest.ParentId, opt => opt.MapFrom(src => src.ParentId))
.ForMember(dest => dest.Trashed, opt => opt.Ignore())
diff --git a/src/Umbraco.Web/Models/Mapping/LanguageMapperProfile.cs b/src/Umbraco.Web/Models/Mapping/LanguageMapperProfile.cs
index 13c6af2fda..a838180622 100644
--- a/src/Umbraco.Web/Models/Mapping/LanguageMapperProfile.cs
+++ b/src/Umbraco.Web/Models/Mapping/LanguageMapperProfile.cs
@@ -17,7 +17,7 @@ namespace Umbraco.Web.Models.Mapping
.ForMember(dest => dest.Name, opt => opt.MapFrom(x => x.CultureName))
.ForMember(dest => dest.Key, opt => opt.MapFrom(x => x.Key))
.ForMember(dest => dest.Alias, opt => opt.MapFrom(x => x.IsoCode))
- .ForMember(dest => dest.ParentId, opt => opt.UseValue(-1))
+ .ForMember(dest => dest.ParentId, opt => opt.MapFrom(_ => -1))
.ForMember(dest => dest.Path, opt => opt.Ignore())
.ForMember(dest => dest.Trashed, opt => opt.Ignore())
.ForMember(dest => dest.AdditionalData, opt => opt.Ignore())
diff --git a/src/Umbraco.Web/Models/Mapping/MacroMapperProfile.cs b/src/Umbraco.Web/Models/Mapping/MacroMapperProfile.cs
index be1bcdefdc..3e0f6c7337 100644
--- a/src/Umbraco.Web/Models/Mapping/MacroMapperProfile.cs
+++ b/src/Umbraco.Web/Models/Mapping/MacroMapperProfile.cs
@@ -19,9 +19,9 @@ namespace Umbraco.Web.Models.Mapping
//FROM IMacro TO EntityBasic
CreateMap()
.ForMember(x => x.Udi, expression => expression.MapFrom(content => Udi.Create(Constants.UdiEntityType.Macro, content.Key)))
- .ForMember(entityBasic => entityBasic.Icon, expression => expression.UseValue("icon-settings-alt"))
- .ForMember(dto => dto.ParentId, expression => expression.UseValue(-1))
- .ForMember(dto => dto.Path, expression => expression.ResolveUsing(macro => "-1," + macro.Id))
+ .ForMember(entityBasic => entityBasic.Icon, expression => expression.MapFrom(_ => "icon-settings-alt"))
+ .ForMember(dto => dto.ParentId, expression => expression.MapFrom(_ => -1))
+ .ForMember(dto => dto.Path, expression => expression.MapFrom(macro => "-1," + macro.Id))
.ForMember(dto => dto.Trashed, expression => expression.Ignore())
.ForMember(dto => dto.AdditionalData, expression => expression.Ignore());
diff --git a/src/Umbraco.Web/Models/Mapping/MediaMapperProfile.cs b/src/Umbraco.Web/Models/Mapping/MediaMapperProfile.cs
index 7a8706edf2..f5182f0b3b 100644
--- a/src/Umbraco.Web/Models/Mapping/MediaMapperProfile.cs
+++ b/src/Umbraco.Web/Models/Mapping/MediaMapperProfile.cs
@@ -35,37 +35,37 @@ namespace Umbraco.Web.Models.Mapping
//FROM IMedia TO MediaItemDisplay
CreateMap()
.ForMember(dest => dest.Udi, opt => opt.MapFrom(content => Udi.Create(Constants.UdiEntityType.Media, content.Key)))
- .ForMember(dest => dest.Owner, opt => opt.ResolveUsing(src => mediaOwnerResolver.Resolve(src)))
+ .ForMember(dest => dest.Owner, opt => opt.MapFrom(src => mediaOwnerResolver.Resolve(src)))
.ForMember(dest => dest.Icon, opt => opt.MapFrom(content => content.ContentType.Icon))
.ForMember(dest => dest.ContentTypeAlias, opt => opt.MapFrom(content => content.ContentType.Alias))
- .ForMember(dest => dest.IsChildOfListView, opt => opt.ResolveUsing(childOfListViewResolver))
+ .ForMember(dest => dest.IsChildOfListView, opt => opt.MapFrom(childOfListViewResolver))
.ForMember(dest => dest.Trashed, opt => opt.MapFrom(content => content.Trashed))
.ForMember(dest => dest.ContentTypeName, opt => opt.MapFrom(content => content.ContentType.Name))
.ForMember(dest => dest.Properties, opt => opt.Ignore())
- .ForMember(dest => dest.TreeNodeUrl, opt => opt.ResolveUsing(contentTreeNodeUrlResolver))
+ .ForMember(dest => dest.TreeNodeUrl, opt => opt.MapFrom(contentTreeNodeUrlResolver))
.ForMember(dest => dest.Notifications, opt => opt.Ignore())
.ForMember(dest => dest.Errors, opt => opt.Ignore())
- .ForMember(dest => dest.State, opt => opt.UseValue(null))
+ .ForMember(dest => dest.State, opt => opt.MapFrom(_ => null))
.ForMember(dest => dest.Edited, opt => opt.Ignore())
.ForMember(dest => dest.Updater, opt => opt.Ignore())
.ForMember(dest => dest.Alias, opt => opt.Ignore())
.ForMember(dest => dest.IsContainer, opt => opt.Ignore())
- .ForMember(dest => dest.Tabs, opt => opt.ResolveUsing(tabsAndPropertiesResolver))
+ .ForMember(dest => dest.Tabs, opt => opt.MapFrom(tabsAndPropertiesResolver))
.ForMember(dest => dest.AdditionalData, opt => opt.Ignore())
- .ForMember(dest => dest.ContentType, opt => opt.ResolveUsing(mediaTypeBasicResolver))
- .ForMember(dest => dest.MediaLink, opt => opt.ResolveUsing(content => string.Join(",", content.GetUrls(Current.Configs.Settings().Content, logger))))
- .ForMember(dest => dest.ContentApps, opt => opt.ResolveUsing(mediaAppResolver))
+ .ForMember(dest => dest.ContentType, opt => opt.MapFrom(mediaTypeBasicResolver))
+ .ForMember(dest => dest.MediaLink, opt => opt.MapFrom(content => string.Join(",", content.GetUrls(Current.Configs.Settings().Content, logger))))
+ .ForMember(dest => dest.ContentApps, opt => opt.MapFrom(mediaAppResolver))
.ForMember(dest => dest.VariesByCulture, opt => opt.MapFrom(src => src.ContentType.VariesByCulture()));
//FROM IMedia TO ContentItemBasic
CreateMap>()
.ForMember(dest => dest.Udi, opt => opt.MapFrom(src => Udi.Create(Constants.UdiEntityType.Media, src.Key)))
- .ForMember(dest => dest.Owner, opt => opt.ResolveUsing(src => mediaOwnerResolver.Resolve(src)))
+ .ForMember(dest => dest.Owner, opt => opt.MapFrom(src => mediaOwnerResolver.Resolve(src)))
.ForMember(dest => dest.Icon, opt => opt.MapFrom(src => src.ContentType.Icon))
.ForMember(dest => dest.Trashed, opt => opt.MapFrom(src => src.Trashed))
.ForMember(dest => dest.ContentTypeAlias, opt => opt.MapFrom(src => src.ContentType.Alias))
- .ForMember(dest => dest.State, opt => opt.UseValue(null))
+ .ForMember(dest => dest.State, opt => opt.MapFrom(_ => null))
.ForMember(dest => dest.Edited, opt => opt.Ignore())
.ForMember(dest => dest.Updater, opt => opt.Ignore())
.ForMember(dest => dest.Alias, opt => opt.Ignore())
@@ -76,7 +76,7 @@ namespace Umbraco.Web.Models.Mapping
//FROM IMedia TO ContentItemDto
CreateMap();
//.ForMember(dest => dest.Udi, opt => opt.MapFrom(src => Udi.Create(Constants.UdiEntityType.Media, src.Key)))
- //.ForMember(dest => dest.Owner, opt => opt.ResolveUsing(src => mediaOwnerResolver.Resolve(src)))
+ //.ForMember(dest => dest.Owner, opt => opt.MapFrom(src => mediaOwnerResolver.Resolve(src)))
//.ForMember(dest => dest.Published, opt => opt.Ignore())
//.ForMember(dest => dest.Edited, opt => opt.Ignore())
//.ForMember(dest => dest.Updater, opt => opt.Ignore())
diff --git a/src/Umbraco.Web/Models/Mapping/MemberMapperProfile.cs b/src/Umbraco.Web/Models/Mapping/MemberMapperProfile.cs
index af894bee5e..a721714a14 100644
--- a/src/Umbraco.Web/Models/Mapping/MemberMapperProfile.cs
+++ b/src/Umbraco.Web/Models/Mapping/MemberMapperProfile.cs
@@ -64,24 +64,24 @@ namespace Umbraco.Web.Models.Mapping
//FROM IMember TO MemberDisplay
CreateMap()
.ForMember(dest => dest.Udi, opt => opt.MapFrom(content => Udi.Create(Constants.UdiEntityType.Member, content.Key)))
- .ForMember(dest => dest.Owner, opt => opt.ResolveUsing(src => memberOwnerResolver.Resolve(src)))
+ .ForMember(dest => dest.Owner, opt => opt.MapFrom(src => memberOwnerResolver.Resolve(src)))
.ForMember(dest => dest.Icon, opt => opt.MapFrom(src => src.ContentType.Icon))
.ForMember(dest => dest.ContentTypeAlias, opt => opt.MapFrom(src => src.ContentType.Alias))
.ForMember(dest => dest.ContentTypeName, opt => opt.MapFrom(src => src.ContentType.Name))
.ForMember(dest => dest.Properties, opt => opt.Ignore())
- .ForMember(dest => dest.Tabs, opt => opt.ResolveUsing(tabsAndPropertiesResolver))
- .ForMember(dest => dest.MemberProviderFieldMapping, opt => opt.ResolveUsing(src => memberProfiderFieldMappingResolver.Resolve(src)))
- .ForMember(dest => dest.MembershipScenario, opt => opt.ResolveUsing(src => membershipScenarioMappingResolver.Resolve(src)))
+ .ForMember(dest => dest.Tabs, opt => opt.MapFrom(tabsAndPropertiesResolver))
+ .ForMember(dest => dest.MemberProviderFieldMapping, opt => opt.MapFrom(src => memberProfiderFieldMappingResolver.Resolve(src)))
+ .ForMember(dest => dest.MembershipScenario, opt => opt.MapFrom(src => membershipScenarioMappingResolver.Resolve(src)))
.ForMember(dest => dest.Notifications, opt => opt.Ignore())
.ForMember(dest => dest.Errors, opt => opt.Ignore())
- .ForMember(dest => dest.State, opt => opt.UseValue(null))
+ .ForMember(dest => dest.State, opt => opt.MapFrom(_ => null))
.ForMember(dest => dest.Edited, opt => opt.Ignore())
.ForMember(dest => dest.Updater, opt => opt.Ignore())
.ForMember(dest => dest.Alias, opt => opt.Ignore())
.ForMember(dest => dest.IsChildOfListView, opt => opt.Ignore())
.ForMember(dest => dest.Trashed, opt => opt.Ignore())
.ForMember(dest => dest.IsContainer, opt => opt.Ignore())
- .ForMember(dest => dest.TreeNodeUrl, opt => opt.ResolveUsing(memberTreeNodeUrlResolver))
+ .ForMember(dest => dest.TreeNodeUrl, opt => opt.MapFrom(memberTreeNodeUrlResolver))
.ForMember(dest => dest.VariesByCulture, opt => opt.Ignore());
//FROM IMember TO MemberBasic
@@ -89,17 +89,17 @@ namespace Umbraco.Web.Models.Mapping
//we're giving this entity an ID of int.MaxValue - this is kind of a hack to force angular to use the Key instead of the Id in list views
.ForMember(dest => dest.Id, opt => opt.MapFrom(src => int.MaxValue))
.ForMember(dest => dest.Udi, opt => opt.MapFrom(content => Udi.Create(Constants.UdiEntityType.Member, content.Key)))
- .ForMember(dest => dest.Owner, opt => opt.ResolveUsing(src => memberOwnerResolver.Resolve(src)))
+ .ForMember(dest => dest.Owner, opt => opt.MapFrom(src => memberOwnerResolver.Resolve(src)))
.ForMember(dest => dest.Icon, opt => opt.MapFrom(src => src.ContentType.Icon))
.ForMember(dest => dest.ContentTypeAlias, opt => opt.MapFrom(src => src.ContentType.Alias))
.ForMember(dest => dest.Email, opt => opt.MapFrom(src => src.Email))
.ForMember(dest => dest.Username, opt => opt.MapFrom(src => src.Username))
.ForMember(dest => dest.Trashed, opt => opt.Ignore())
- .ForMember(dest => dest.State, opt => opt.UseValue(null))
+ .ForMember(dest => dest.State, opt => opt.MapFrom(_ => null))
.ForMember(dest => dest.Edited, opt => opt.Ignore())
.ForMember(dest => dest.Updater, opt => opt.Ignore())
.ForMember(dest => dest.Alias, opt => opt.Ignore())
- .ForMember(dto => dto.Properties, expression => expression.ResolveUsing(memberBasicPropertiesResolver))
+ .ForMember(dto => dto.Properties, expression => expression.MapFrom(memberBasicPropertiesResolver))
.ForMember(dest => dest.VariesByCulture, opt => opt.Ignore());
//FROM MembershipUser TO MemberBasic
@@ -110,8 +110,8 @@ namespace Umbraco.Web.Models.Mapping
.ForMember(dest => dest.CreateDate, opt => opt.MapFrom(src => src.CreationDate))
.ForMember(dest => dest.UpdateDate, opt => opt.MapFrom(src => src.LastActivityDate))
.ForMember(dest => dest.Key, opt => opt.MapFrom(src => src.ProviderUserKey.TryConvertTo().Result.ToString("N")))
- .ForMember(dest => dest.Owner, opt => opt.UseValue(new UserProfile {Name = "Admin", UserId = -1 }))
- .ForMember(dest => dest.Icon, opt => opt.UseValue("icon-user"))
+ .ForMember(dest => dest.Owner, opt => opt.MapFrom(_ => new UserProfile {Name = "Admin", UserId = -1 }))
+ .ForMember(dest => dest.Icon, opt => opt.MapFrom(_ => "icon-user"))
.ForMember(dest => dest.Name, opt => opt.MapFrom(src => src.UserName))
.ForMember(dest => dest.Email, opt => opt.MapFrom(src => src.Email))
.ForMember(dest => dest.Username, opt => opt.MapFrom(src => src.UserName))
@@ -120,7 +120,7 @@ namespace Umbraco.Web.Models.Mapping
.ForMember(dest => dest.Path, opt => opt.Ignore())
.ForMember(dest => dest.SortOrder, opt => opt.Ignore())
.ForMember(dest => dest.AdditionalData, opt => opt.Ignore())
- .ForMember(dest => dest.State, opt => opt.UseValue(ContentSavedState.Draft))
+ .ForMember(dest => dest.State, opt => opt.MapFrom(_ => ContentSavedState.Draft))
.ForMember(dest => dest.Edited, opt => opt.Ignore())
.ForMember(dest => dest.Updater, opt => opt.Ignore())
.ForMember(dest => dest.Trashed, opt => opt.Ignore())
@@ -131,14 +131,14 @@ namespace Umbraco.Web.Models.Mapping
//FROM IMember TO ContentItemDto
CreateMap()
//.ForMember(dest => dest.Udi, opt => opt.MapFrom(content => Udi.Create(Constants.UdiEntityType.Member, content.Key)))
- //.ForMember(dest => dest.Owner, opt => opt.ResolveUsing(src => memberOwnerResolver.Resolve(src)))
+ //.ForMember(dest => dest.Owner, opt => opt.MapFrom(src => memberOwnerResolver.Resolve(src)))
//.ForMember(dest => dest.Published, opt => opt.Ignore())
//.ForMember(dest => dest.Edited, opt => opt.Ignore())
//.ForMember(dest => dest.Updater, opt => opt.Ignore())
//.ForMember(dest => dest.Icon, opt => opt.Ignore())
//.ForMember(dest => dest.Alias, opt => opt.Ignore())
//do no map the custom member properties (currently anyways, they were never there in 6.x)
- .ForMember(dest => dest.Properties, opt => opt.ResolveUsing(src => memberDtoPropertiesResolver.Resolve(src)));
+ .ForMember(dest => dest.Properties, opt => opt.MapFrom(src => memberDtoPropertiesResolver.Resolve(src)));
//FROM IMemberGroup TO MemberGroupDisplay
CreateMap()
diff --git a/src/Umbraco.Web/Models/Mapping/UserMapperProfile.cs b/src/Umbraco.Web/Models/Mapping/UserMapperProfile.cs
index 6f3af3b812..84660d2602 100644
--- a/src/Umbraco.Web/Models/Mapping/UserMapperProfile.cs
+++ b/src/Umbraco.Web/Models/Mapping/UserMapperProfile.cs
@@ -99,7 +99,7 @@ namespace Umbraco.Web.Models.Mapping
.ForMember(dest => dest.LastLockoutDate, opt => opt.Ignore())
.ForMember(dest => dest.FailedPasswordAttempts, opt => opt.Ignore())
//all invited users will not be approved, completing the invite will approve the user
- .ForMember(user => user.IsApproved, opt => opt.UseValue(false))
+ .ForMember(user => user.IsApproved, opt => opt.MapFrom(_ => false))
.AfterMap((invite, user) =>
{
user.ClearGroups();
@@ -119,7 +119,7 @@ namespace Umbraco.Web.Models.Mapping
.ForMember(dest => dest.Notifications, opt => opt.Ignore())
.ForMember(dest => dest.Udi, opt => opt.Ignore())
.ForMember(dest => dest.Trashed, opt => opt.Ignore())
- .ForMember(dest => dest.ParentId, opt => opt.UseValue(-1))
+ .ForMember(dest => dest.ParentId, opt => opt.MapFrom(_ => -1))
.ForMember(dest => dest.Path, opt => opt.MapFrom(userGroup => "-1," + userGroup.Id))
.ForMember(dest => dest.AdditionalData, opt => opt.Ignore())
.AfterMap((group, display) =>
@@ -134,7 +134,7 @@ namespace Umbraco.Web.Models.Mapping
.ForMember(dest => dest.Notifications, opt => opt.Ignore())
.ForMember(dest => dest.Udi, opt => opt.Ignore())
.ForMember(dest => dest.Trashed, opt => opt.Ignore())
- .ForMember(dest => dest.ParentId, opt => opt.UseValue(-1))
+ .ForMember(dest => dest.ParentId, opt => opt.MapFrom(_ => -1))
.ForMember(dest => dest.Path, opt => opt.MapFrom(userGroup => "-1," + userGroup.Id))
.ForMember(dest => dest.AdditionalData, opt => opt.Ignore())
.AfterMap((group, display) =>
@@ -148,9 +148,9 @@ namespace Umbraco.Web.Models.Mapping
.ForMember(dest => dest.Trashed, opt => opt.Ignore())
.ForMember(dest => dest.AdditionalData, opt => opt.Ignore())
.ForMember(dest => dest.Id, opt => opt.MapFrom(group => group.Id))
- .ForMember(dest => dest.ParentId, opt => opt.UseValue(-1))
+ .ForMember(dest => dest.ParentId, opt => opt.MapFrom(_ => -1))
.ForMember(dest => dest.Path, opt => opt.MapFrom(userGroup => "-1," + userGroup.Id))
- .ForMember(dest => dest.DefaultPermissions, opt => opt.ResolveUsing(src => userGroupDefaultPermissionsResolver.Resolve(src)))
+ .ForMember(dest => dest.DefaultPermissions, opt => opt.MapFrom(src => userGroupDefaultPermissionsResolver.Resolve(src)))
//these will be manually mapped and by default they are null
.ForMember(dest => dest.AssignedPermissions, opt => opt.Ignore())
.AfterMap((group, display) =>
@@ -182,11 +182,11 @@ namespace Umbraco.Web.Models.Mapping
.ForMember(dest => dest.Notifications, opt => opt.Ignore())
.ForMember(dest => dest.Udi, opt => opt.Ignore())
.ForMember(dest => dest.Trashed, opt => opt.Ignore())
- .ForMember(dest => dest.ParentId, opt => opt.UseValue(-1))
+ .ForMember(dest => dest.ParentId, opt => opt.MapFrom(_ => -1))
.ForMember(dest => dest.Path, opt => opt.MapFrom(userGroup => "-1," + userGroup.Id))
.ForMember(dest => dest.AdditionalData, opt => opt.Ignore())
.ForMember(dest => dest.Users, opt => opt.Ignore())
- .ForMember(dest => dest.DefaultPermissions, opt => opt.ResolveUsing(src => userGroupDefaultPermissionsResolver.Resolve(src)))
+ .ForMember(dest => dest.DefaultPermissions, opt => opt.MapFrom(src => userGroupDefaultPermissionsResolver.Resolve(src)))
.ForMember(dest => dest.AssignedPermissions, opt => opt.Ignore())
.AfterMap((group, display) =>
{
@@ -276,7 +276,7 @@ namespace Umbraco.Web.Models.Mapping
.ForMember(
dest => dest.EmailHash,
opt => opt.MapFrom(user => user.Email.ToLowerInvariant().Trim().GenerateHash()))
- .ForMember(dest => dest.ParentId, opt => opt.UseValue(-1))
+ .ForMember(dest => dest.ParentId, opt => opt.MapFrom(_ => -1))
.ForMember(dest => dest.Path, opt => opt.MapFrom(user => "-1," + user.Id))
.ForMember(dest => dest.Notifications, opt => opt.Ignore())
.ForMember(dest => dest.Udi, opt => opt.Ignore())
@@ -302,7 +302,7 @@ namespace Umbraco.Web.Models.Mapping
.ForMember(
dest => dest.EmailHash,
opt => opt.MapFrom(user => user.Email.ToLowerInvariant().Trim().ToMd5()))
- .ForMember(dest => dest.ParentId, opt => opt.UseValue(-1))
+ .ForMember(dest => dest.ParentId, opt => opt.MapFrom(_ => -1))
.ForMember(dest => dest.Path, opt => opt.MapFrom(user => "-1," + user.Id))
.ForMember(dest => dest.Notifications, opt => opt.Ignore())
.ForMember(dest => dest.IsCurrentUser, opt => opt.Ignore())
diff --git a/src/Umbraco.Web/Trees/ApplicationTreeController.cs b/src/Umbraco.Web/Trees/ApplicationTreeController.cs
index 68d7fbb3fd..162d001e96 100644
--- a/src/Umbraco.Web/Trees/ApplicationTreeController.cs
+++ b/src/Umbraco.Web/Trees/ApplicationTreeController.cs
@@ -1,6 +1,5 @@
using System;
using System.Collections.Generic;
-using System.Globalization;
using System.Linq;
using System.Net;
using System.Net.Http;
@@ -50,8 +49,7 @@ namespace Umbraco.Web.Trees
///
/// Tree use.
///
- [HttpQueryStringFilter("queryStrings")]
- public async Task GetApplicationTrees(string application, string tree, FormDataCollection queryStrings, TreeUse use = TreeUse.Main)
+ public async Task GetApplicationTrees(string application, string tree, [System.Web.Http.ModelBinding.ModelBinder(typeof(HttpQueryStringModelBinder))]FormDataCollection queryStrings, TreeUse use = TreeUse.Main)
{
application = application.CleanForXss();
diff --git a/src/Umbraco.Web/Trees/ContentTreeControllerBase.cs b/src/Umbraco.Web/Trees/ContentTreeControllerBase.cs
index ca2f2031bb..e521deca40 100644
--- a/src/Umbraco.Web/Trees/ContentTreeControllerBase.cs
+++ b/src/Umbraco.Web/Trees/ContentTreeControllerBase.cs
@@ -14,6 +14,7 @@ using Umbraco.Web.Models.Trees;
using Umbraco.Web.WebApi.Filters;
using System.Globalization;
using Umbraco.Core.Models.Entities;
+using System.Web.Http.ModelBinding;
using Umbraco.Web.Actions;
using Umbraco.Web.Composing;
@@ -30,8 +31,7 @@ namespace Umbraco.Web.Trees
///
///
///
- [HttpQueryStringFilter("queryStrings")]
- public TreeNode GetTreeNode(string id, FormDataCollection queryStrings)
+ public TreeNode GetTreeNode(string id, [ModelBinder(typeof(HttpQueryStringModelBinder))]FormDataCollection queryStrings)
{
int asInt;
Guid asGuid = Guid.Empty;
diff --git a/src/Umbraco.Web/Trees/MemberTreeController.cs b/src/Umbraco.Web/Trees/MemberTreeController.cs
index 430c5d2111..6107540c0c 100644
--- a/src/Umbraco.Web/Trees/MemberTreeController.cs
+++ b/src/Umbraco.Web/Trees/MemberTreeController.cs
@@ -5,6 +5,7 @@ using System.Net;
using System.Net.Http;
using System.Net.Http.Formatting;
using System.Web.Http;
+using System.Web.Http.ModelBinding;
using System.Web.Security;
using Umbraco.Core;
using Umbraco.Core.Models;
@@ -49,8 +50,7 @@ namespace Umbraco.Web.Trees
///
///
///
- [HttpQueryStringFilter("queryStrings")]
- public TreeNode GetTreeNode(string id, FormDataCollection queryStrings)
+ public TreeNode GetTreeNode(string id, [ModelBinder(typeof(HttpQueryStringModelBinder))]FormDataCollection queryStrings)
{
var node = GetSingleTreeNode(id, queryStrings);
diff --git a/src/Umbraco.Web/Trees/TreeControllerBase.cs b/src/Umbraco.Web/Trees/TreeControllerBase.cs
index e3946ce532..f7c2b2460e 100644
--- a/src/Umbraco.Web/Trees/TreeControllerBase.cs
+++ b/src/Umbraco.Web/Trees/TreeControllerBase.cs
@@ -2,6 +2,7 @@
using System.Globalization;
using System.Linq;
using System.Net.Http.Formatting;
+using System.Web.Http.ModelBinding;
using Umbraco.Core;
using Umbraco.Core.Cache;
using Umbraco.Core.Configuration;
@@ -45,7 +46,7 @@ namespace Umbraco.Web.Trees
/// We are allowing an arbitrary number of query strings to be passed in so that developers are able to persist custom data from the front-end
/// to the back end to be used in the query for model data.
///
- protected abstract TreeNodeCollection GetTreeNodes(string id, FormDataCollection queryStrings);
+ protected abstract TreeNodeCollection GetTreeNodes(string id, [ModelBinder(typeof(HttpQueryStringModelBinder))]FormDataCollection queryStrings);
///
/// Returns the menu structure for the node
@@ -53,7 +54,7 @@ namespace Umbraco.Web.Trees
///
///
///
- protected abstract MenuItemCollection GetMenuForNode(string id, FormDataCollection queryStrings);
+ protected abstract MenuItemCollection GetMenuForNode(string id, [ModelBinder(typeof(HttpQueryStringModelBinder))]FormDataCollection queryStrings);
///
/// The name to display on the root node
@@ -86,8 +87,7 @@ namespace Umbraco.Web.Trees
///
///
///
- [HttpQueryStringFilter("queryStrings")]
- public TreeNode GetRootNode(FormDataCollection queryStrings)
+ public TreeNode GetRootNode([ModelBinder(typeof(HttpQueryStringModelBinder))]FormDataCollection queryStrings)
{
if (queryStrings == null) queryStrings = new FormDataCollection("");
var node = CreateRootNode(queryStrings);
@@ -126,8 +126,7 @@ namespace Umbraco.Web.Trees
/// We are allowing an arbitrary number of query strings to be passed in so that developers are able to persist custom data from the front-end
/// to the back end to be used in the query for model data.
///
- [HttpQueryStringFilter("queryStrings")]
- public TreeNodeCollection GetNodes(string id, FormDataCollection queryStrings)
+ public TreeNodeCollection GetNodes(string id, [ModelBinder(typeof(HttpQueryStringModelBinder))]FormDataCollection queryStrings)
{
if (queryStrings == null) queryStrings = new FormDataCollection("");
var nodes = GetTreeNodes(id, queryStrings);
@@ -158,8 +157,7 @@ namespace Umbraco.Web.Trees
///
///
///
- [HttpQueryStringFilter("queryStrings")]
- public MenuItemCollection GetMenu(string id, FormDataCollection queryStrings)
+ public MenuItemCollection GetMenu(string id, [ModelBinder(typeof(HttpQueryStringModelBinder))]FormDataCollection queryStrings)
{
if (queryStrings == null) queryStrings = new FormDataCollection("");
var menu = GetMenuForNode(id, queryStrings);
diff --git a/src/Umbraco.Web/Umbraco.Web.csproj b/src/Umbraco.Web/Umbraco.Web.csproj
index 1cb2e9a53e..8699540e4b 100755
--- a/src/Umbraco.Web/Umbraco.Web.csproj
+++ b/src/Umbraco.Web/Umbraco.Web.csproj
@@ -60,32 +60,32 @@
-
+
-
+
2.6.2.25
-
+
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
-
+
@@ -283,6 +283,7 @@
+
@@ -1057,7 +1058,6 @@
-
diff --git a/src/Umbraco.Web/WebApi/Filters/HttpQueryStringFilterAttribute.cs b/src/Umbraco.Web/WebApi/Filters/HttpQueryStringFilterAttribute.cs
deleted file mode 100644
index eea4ef7e67..0000000000
--- a/src/Umbraco.Web/WebApi/Filters/HttpQueryStringFilterAttribute.cs
+++ /dev/null
@@ -1,43 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Net.Http.Formatting;
-using System.Web.Http.Controllers;
-using System.Web.Http.Filters;
-
-namespace Umbraco.Web.WebApi.Filters
-{
- ///
- /// Allows an Action to execute with an arbitrary number of QueryStrings
- ///
- ///
- /// Just like you can POST an arbitrary number of parameters to an Action, you can't GET an arbitrary number
- /// but this will allow you to do it
- ///
- public sealed class HttpQueryStringFilterAttribute : ActionFilterAttribute
- {
- public string ParameterName { get; private set; }
-
- public HttpQueryStringFilterAttribute(string parameterName)
- {
- if (string.IsNullOrEmpty(parameterName))
- throw new ArgumentException("ParameterName is required.");
- ParameterName = parameterName;
- }
-
- public override void OnActionExecuting(HttpActionContext actionContext)
- {
- //get the query strings from the request properties
- if (actionContext.Request.Properties.ContainsKey("MS_QueryNameValuePairs"))
- {
- var queryStrings = actionContext.Request.Properties["MS_QueryNameValuePairs"] as IEnumerable>;
- if (queryStrings == null) return;
-
- var formData = new FormDataCollection(queryStrings);
-
- actionContext.ActionArguments[ParameterName] = formData;
- }
-
- base.OnActionExecuting(actionContext);
- }
- }
-}
diff --git a/src/Umbraco.Web/WebApi/Filters/HttpQueryStringModelBinder.cs b/src/Umbraco.Web/WebApi/Filters/HttpQueryStringModelBinder.cs
new file mode 100644
index 0000000000..6ffbb239f8
--- /dev/null
+++ b/src/Umbraco.Web/WebApi/Filters/HttpQueryStringModelBinder.cs
@@ -0,0 +1,32 @@
+using System.Collections.Generic;
+using System.Net.Http.Formatting;
+using System.Web.Http.Controllers;
+using System.Web.Http.ModelBinding;
+
+namespace Umbraco.Web.WebApi.Filters
+{
+ ///
+ /// Allows an Action to execute with an arbitrary number of QueryStrings
+ ///
+ ///
+ /// Just like you can POST an arbitrary number of parameters to an Action, you can't GET an arbitrary number
+ /// but this will allow you to do it
+ ///
+ public sealed class HttpQueryStringModelBinder : IModelBinder
+ {
+ public bool BindModel(HttpActionContext actionContext, ModelBindingContext bindingContext)
+ {
+ //get the query strings from the request properties
+ if (actionContext.Request.Properties.ContainsKey("MS_QueryNameValuePairs"))
+ {
+ if (actionContext.Request.Properties["MS_QueryNameValuePairs"] is IEnumerable> queryStrings)
+ {
+ var formData = new FormDataCollection(queryStrings);
+ bindingContext.Model = formData;
+ return true;
+ }
+ }
+ return false;
+ }
+ }
+}
\ No newline at end of file