diff --git a/src/Umbraco.Core/Models/Template.cs b/src/Umbraco.Core/Models/Template.cs
index 2a2f59d132..25347fd861 100644
--- a/src/Umbraco.Core/Models/Template.cs
+++ b/src/Umbraco.Core/Models/Template.cs
@@ -5,6 +5,7 @@ using System.Runtime.Serialization;
using Umbraco.Core.Configuration;
using Umbraco.Core.IO;
using Umbraco.Core.Models.EntityBase;
+using Umbraco.Core.Strings;
namespace Umbraco.Core.Models
{
@@ -42,8 +43,8 @@ namespace Umbraco.Core.Models
{
base.Path = path;
ParentId = -1;
- _name = name.Replace("/", ".").Replace("\\", "");
- _alias = alias.ToSafeAlias();
+ _name = name; //.Replace("/", ".").Replace("\\", ""); // why? that's just the name!
+ _alias = alias.ToCleanString(CleanStringType.UnderscoreAlias);
}
[DataMember]
diff --git a/src/Umbraco.Core/Strings/CleanStringType.cs b/src/Umbraco.Core/Strings/CleanStringType.cs
index ea9603ec6f..0e0a7c9908 100644
--- a/src/Umbraco.Core/Strings/CleanStringType.cs
+++ b/src/Umbraco.Core/Strings/CleanStringType.cs
@@ -92,7 +92,7 @@ namespace Umbraco.Core.Strings
///
/// Flag mask for role.
///
- RoleMask = UrlSegment | Alias | FileName | ConvertCase,
+ RoleMask = UrlSegment | Alias | UnderscoreAlias | FileName | ConvertCase,
///
/// Url role.
@@ -112,6 +112,12 @@ namespace Umbraco.Core.Strings
///
/// ConvertCase role.
///
- ConvertCase = 0x080000
+ ConvertCase = 0x080000,
+
+ ///
+ /// UnderscoreAlias role.
+ ///
+ /// This is Alias + leading underscore.
+ UnderscoreAlias = 0x100000
}
}
diff --git a/src/Umbraco.Core/Strings/DefaultShortStringHelper.cs b/src/Umbraco.Core/Strings/DefaultShortStringHelper.cs
index 508e356f71..879f4f0115 100644
--- a/src/Umbraco.Core/Strings/DefaultShortStringHelper.cs
+++ b/src/Umbraco.Core/Strings/DefaultShortStringHelper.cs
@@ -193,6 +193,12 @@ namespace Umbraco.Core.Strings
: (char.IsLetterOrDigit(c) || c == '_'), // letter, digit or underscore
StringType = CleanStringType.Ascii | CleanStringType.UmbracoCase,
BreakTermsOnUpper = false
+ }).WithConfig(CleanStringType.UnderscoreAlias, new Config
+ {
+ PreFilter = ApplyUrlReplaceCharacters,
+ IsTerm = (c, leading) => char.IsLetterOrDigit(c) || c == '_', // letter, digit or underscore
+ StringType = CleanStringType.Ascii | CleanStringType.UmbracoCase,
+ BreakTermsOnUpper = false
}).WithConfig(CleanStringType.ConvertCase, new Config
{
PreFilter = null,
diff --git a/src/umbraco.cms/businesslogic/template/Template.cs b/src/umbraco.cms/businesslogic/template/Template.cs
index 38a05adbf2..08f6e5d5e3 100644
--- a/src/umbraco.cms/businesslogic/template/Template.cs
+++ b/src/umbraco.cms/businesslogic/template/Template.cs
@@ -6,6 +6,7 @@ using Umbraco.Core;
using Umbraco.Core.Cache;
using Umbraco.Core.IO;
using Umbraco.Core.Logging;
+using Umbraco.Core.Strings;
using umbraco.DataLayer;
using System.Text.RegularExpressions;
using System.IO;
@@ -204,7 +205,7 @@ namespace umbraco.cms.businesslogic.template
{
FlushCache();
_oldAlias = _alias;
- _alias = value;
+ _alias = value.ToCleanString(CleanStringType.UnderscoreAlias);
SqlHelper.ExecuteNonQuery("Update cmsTemplate set alias = @alias where NodeId = " + this.Id, SqlHelper.CreateParameter("@alias", _alias));
_templateAliasesInitialized = false;
@@ -402,13 +403,13 @@ namespace umbraco.cms.businesslogic.template
var node = MakeNew(-1, ObjectType, u.Id, 1, name, Guid.NewGuid());
//ensure unique alias
- name = helpers.Casing.SafeAlias(name);
+ name = name.ToCleanString(CleanStringType.UnderscoreAlias);
if (GetByAlias(name) != null)
name = EnsureUniqueAlias(name, 1);
- name = name.Replace("/", ".").Replace("\\", "");
+ //name = name.Replace("/", ".").Replace("\\", ""); //why? ToSafeAlias() already removes those chars
if (name.Length > 100)
- name = name.Substring(0, 95) + "...";
+ name = name.Substring(0, 95); // + "..."; // no, these are invalid alias chars
SqlHelper.ExecuteNonQuery("INSERT INTO cmsTemplate (NodeId, Alias, design, master) VALUES (@nodeId, @alias, @design, @master)",