Files
Umbraco-CMS/src/Umbraco.Core/Models/Template.cs

187 lines
6.0 KiB
C#

using System;
using System.Collections.Generic;
using System.Reflection;
using System.Runtime.Serialization;
using Umbraco.Core.Configuration;
using Umbraco.Core.IO;
namespace Umbraco.Core.Models
{
/// <summary>
/// Represents a Template file
/// </summary>
[Serializable]
[DataContract(IsReference = true)]
public class Template : File, ITemplate
{
private readonly string _alias;
private readonly string _name;
private int _creatorId;
private int _level;
private int _sortOrder;
private int _parentId;
private int _masterTemplateId;
private string _masterTemplateAlias;
private static readonly PropertyInfo CreatorIdSelector = ExpressionHelper.GetPropertyInfo<Template, int>(x => x.CreatorId);
private static readonly PropertyInfo LevelSelector = ExpressionHelper.GetPropertyInfo<Template, int>(x => x.Level);
private static readonly PropertyInfo SortOrderSelector = ExpressionHelper.GetPropertyInfo<Template, int>(x => x.SortOrder);
private static readonly PropertyInfo ParentIdSelector = ExpressionHelper.GetPropertyInfo<Template, int>(x => x.ParentId);
//private static readonly PropertyInfo MasterTemplateIdSelector = ExpressionHelper.GetPropertyInfo<Template, int>(x => x.MasterTemplateId);
private static readonly PropertyInfo MasterTemplateAliasSelector = ExpressionHelper.GetPropertyInfo<Template, string>(x => x.MasterTemplateAlias);
public Template(string path, string name, string alias)
: base(path)
{
base.Path = path;
ParentId = -1;
_name = name.Replace("/", ".").Replace("\\", "");
_alias = alias.ToSafeAlias();
}
[DataMember]
internal int CreatorId
{
get { return _creatorId; }
set
{
SetPropertyValueAndDetectChanges(o =>
{
_creatorId = value;
return _creatorId;
}, _creatorId, CreatorIdSelector);
}
}
[DataMember]
internal int Level
{
get { return _level; }
set
{
SetPropertyValueAndDetectChanges(o =>
{
_level = value;
return _level;
}, _level, LevelSelector);
}
}
[DataMember]
internal int SortOrder
{
get { return _sortOrder; }
set
{
SetPropertyValueAndDetectChanges(o =>
{
_sortOrder = value;
return _sortOrder;
}, _sortOrder, SortOrderSelector);
}
}
[DataMember]
internal int ParentId
{
get { return _parentId; }
set
{
SetPropertyValueAndDetectChanges(o =>
{
_parentId = value;
return _parentId;
}, _parentId, ParentIdSelector);
}
}
[DataMember]
internal Lazy<int> MasterTemplateId { get; set; }
[DataMember]
internal string MasterTemplateAlias
{
get { return _masterTemplateAlias; }
set
{
SetPropertyValueAndDetectChanges(o =>
{
_masterTemplateAlias = value;
return _masterTemplateAlias;
}, _masterTemplateAlias, MasterTemplateAliasSelector);
}
}
[DataMember]
public override string Alias
{
get
{
return _alias;
}
}
[DataMember]
public override string Name
{
get
{
return _name;
}
}
/// <summary>
/// Returns the <see cref="RenderingEngine"/> that corresponds to the template file
/// </summary>
/// <returns><see cref="RenderingEngine"/></returns>
public RenderingEngine GetTypeOfRenderingEngine()
{
if(Path.EndsWith("cshtml") || Path.EndsWith("vbhtml"))
return RenderingEngine.Mvc;
return RenderingEngine.WebForms;
}
/// <summary>
/// Boolean indicating whether the file could be validated
/// </summary>
/// <returns>True if file is valid, otherwise false</returns>
public override bool IsValid()
{
var exts = new List<string>();
if (UmbracoConfig.For.UmbracoSettings().Templates.DefaultRenderingEngine == RenderingEngine.Mvc)
{
exts.Add("cshtml");
exts.Add("vbhtml");
}
else
{
exts.Add(UmbracoConfig.For.UmbracoSettings().Templates.UseAspNetMasterPages ? "master" : "aspx");
}
var dirs = SystemDirectories.Masterpages;
if (UmbracoConfig.For.UmbracoSettings().Templates.DefaultRenderingEngine == RenderingEngine.Mvc)
dirs += "," + SystemDirectories.MvcViews;
//Validate file
var validFile = IOHelper.VerifyEditPath(Path, dirs.Split(','));
//Validate extension
var validExtension = IOHelper.VerifyFileExtension(Path, exts);
return validFile && validExtension;
}
/// <summary>
/// Method to call when Entity is being saved
/// </summary>
/// <remarks>Created date is set and a Unique key is assigned</remarks>
internal override void AddingEntity()
{
base.AddingEntity();
if (Key == Guid.Empty)
Key = Guid.NewGuid();
}
}
}