diff --git a/src/Umbraco.Web/Models/PublishedProperty.cs b/src/Umbraco.Web/Models/PublishedProperty.cs
new file mode 100644
index 0000000000..e5d376c98e
--- /dev/null
+++ b/src/Umbraco.Web/Models/PublishedProperty.cs
@@ -0,0 +1,69 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Umbraco.Core;
+using Umbraco.Core.Models;
+using Umbraco.Core.Models.PublishedContent;
+using Umbraco.Core.PropertyEditors;
+using Umbraco.Core.Services;
+
+namespace Umbraco.Web.Models
+{
+ public static class PublishedProperty
+ {
+ ///
+ /// Maps a collection of Property to a collection of IPublishedProperty for a specified collection of PublishedPropertyType.
+ ///
+ /// The published property types.
+ /// The properties.
+ /// A mapping function.
+ /// A collection of IPublishedProperty corresponding to the collection of PublishedPropertyType
+ /// and taking values from the collection of Property.
+ /// Ensures that all conversions took place correctly.
+ internal static IEnumerable MapProperties(
+ IEnumerable propertyTypes, IEnumerable properties,
+ Func map)
+ {
+ var peResolver = PropertyEditorResolver.Current;
+ var dtService = ApplicationContext.Current.Services.DataTypeService;
+ return MapProperties(propertyTypes, properties, peResolver, dtService, map);
+ }
+
+ ///
+ /// Maps a collection of Property to a collection of IPublishedProperty for a specified collection of PublishedPropertyType.
+ ///
+ /// The published property types.
+ /// The properties.
+ /// A mapping function.
+ /// A PropertyEditorResolver instance.
+ /// An IDataTypeService instance.
+ /// A collection of IPublishedProperty corresponding to the collection of PublishedPropertyType
+ /// and taking values from the collection of Property.
+ /// Ensures that all conversions took place correctly.
+ internal static IEnumerable MapProperties(
+ IEnumerable propertyTypes, IEnumerable properties,
+ PropertyEditorResolver propertyEditorResolver, IDataTypeService dataTypeService,
+ Func map)
+ {
+ return propertyTypes
+ .Select(x =>
+ {
+ var p = properties.SingleOrDefault(xx => xx.Alias == x.PropertyTypeAlias);
+ var v = p == null || p.Value == null ? null : p.Value;
+ if (v != null)
+ {
+ var e = propertyEditorResolver.GetByAlias(x.PropertyEditorAlias);
+ if (e != null)
+ v = e.ValueEditor.ConvertDbToString(p, p.PropertyType, dataTypeService);
+ }
+ // fixme - means that the IPropertyValueConverter will always get a string
+ // fixme and never an int or DateTime that's in the DB unless the value editor has
+ // fixme a way to say it's OK to use what's in the DB?
+
+ return map(x, p, v);
+ });
+ }
+ }
+}
diff --git a/src/Umbraco.Web/PublishedCache/MemberPublishedContent.cs b/src/Umbraco.Web/PublishedCache/MemberPublishedContent.cs
index deafcaab40..8570226a64 100644
--- a/src/Umbraco.Web/PublishedCache/MemberPublishedContent.cs
+++ b/src/Umbraco.Web/PublishedCache/MemberPublishedContent.cs
@@ -6,6 +6,8 @@ using System.Web.Security;
using Umbraco.Core;
using Umbraco.Core.Models;
using Umbraco.Core.Models.PublishedContent;
+using Umbraco.Core.PropertyEditors;
+using Umbraco.Core.Services;
using Umbraco.Web.Models;
namespace Umbraco.Web.PublishedCache
@@ -18,7 +20,7 @@ namespace Umbraco.Web.PublishedCache
private readonly IMember _member;
private readonly MembershipUser _membershipUser;
- private readonly List _properties;
+ private readonly IPublishedProperty[] _properties;
private readonly PublishedContentType _publishedMemberType;
public MemberPublishedContent(IMember member, MembershipUser membershipUser)
@@ -28,21 +30,18 @@ namespace Umbraco.Web.PublishedCache
_member = member;
_membershipUser = membershipUser;
- _properties = new List();
_publishedMemberType = PublishedContentType.Get(PublishedItemType.Member, _member.ContentTypeAlias);
if (_publishedMemberType == null)
{
throw new InvalidOperationException("Could not get member type with alias " + _member.ContentTypeAlias);
}
- foreach (var propType in _publishedMemberType.PropertyTypes)
- {
- var val = _member.Properties.Any(x => x.Alias == propType.PropertyTypeAlias) == false
- ? string.Empty
- : _member.Properties[propType.PropertyTypeAlias].Value;
- _properties.Add(new RawValueProperty(propType, val ?? string.Empty));
- }
+
+ _properties = PublishedProperty.MapProperties(_publishedMemberType.PropertyTypes, _member.Properties,
+ (t, p, v) => new RawValueProperty(t, v ?? string.Empty))
+ .ToArray();
}
+
#region Membership provider member properties
public string Email
{
diff --git a/src/Umbraco.Web/Umbraco.Web.csproj b/src/Umbraco.Web/Umbraco.Web.csproj
index 29815c85d6..41cc68370a 100644
--- a/src/Umbraco.Web/Umbraco.Web.csproj
+++ b/src/Umbraco.Web/Umbraco.Web.csproj
@@ -352,6 +352,7 @@
+