Примеры NVelocity ASP.NET
Я хочу использовать NVelocity в своем приложении ASP.NET MVC, а не в качестве движка представления, просто для рендеринга некоторых шаблонов электронной почты.
Тем не менее, я не могу на всю жизнь заставить его работать. Я скачал его из проекта замка и последовал примеру на http://www.castleproject.org/others/nvelocity/usingit.html
Неважно, что я пытаюсь, я не могу загрузить шаблон, расположенный на моем сайте. В примере предлагается использовать абсолютный путь, который я пытался безрезультатно:
Template t = engine.GetTemplate("/Templates/TestEmail.vm");
Поэтому, пожалуйста, кто-нибудь может дать мне два примера. Одна из загрузки шаблона, расположенного в каталоге веб-сайта, а вторая - синтаксический анализ строковой переменной (поскольку вполне вероятно, что мои шаблоны будут храниться в базе данных).
Большое спасибо Бен
3 ответа
Я использовал этот класс в одном из моих прошлых проектов:
public interface ITemplateRepository
{
string RenderTemplate(string templateName, IDictionary<string, object> data);
string RenderTemplate(string masterPage, string templateName, IDictionary<string, object> data);
}
public class NVelocityTemplateRepository : ITemplateRepository
{
private readonly string _templatesPath;
public NVelocityTemplateRepository(string templatesPath)
{
_templatesPath = templatesPath;
}
public string RenderTemplate(string templateName, IDictionary<string, object> data)
{
return RenderTemplate(null, templateName, data);
}
public string RenderTemplate(string masterPage, string templateName, IDictionary<string, object> data)
{
if (string.IsNullOrEmpty(templateName))
{
throw new ArgumentException("The \"templateName\" parameter must be specified", "templateName");
}
var name = !string.IsNullOrEmpty(masterPage)
? masterPage : templateName;
var engine = new VelocityEngine();
var props = new ExtendedProperties();
props.AddProperty(RuntimeConstants.FILE_RESOURCE_LOADER_PATH, _templatesPath);
engine.Init(props);
var template = engine.GetTemplate(name);
template.Encoding = Encoding.UTF8.BodyName;
var context = new VelocityContext();
var templateData = data ?? new Dictionary<string, object>();
foreach (var key in templateData.Keys)
{
context.Put(key, templateData[key]);
}
if (!string.IsNullOrEmpty(masterPage))
{
context.Put("childContent", templateName);
}
using (var writer = new StringWriter())
{
engine.MergeTemplate(name, context, writer);
return writer.GetStringBuilder().ToString();
}
}
}
Для того, чтобы создать экземпляр NVelocityTemplateRepository
класс, вам нужно указать абсолютный путь к корневому каталогу вашего шаблона. Затем вы используете относительные пути для ссылки на ваш vm
файлы.
Я также добавил следующий метод для обработки строки вместо файла шаблона (например, при извлечении содержимого шаблона из базы данных):
public string RenderTemplateContent(string templateContent, IDictionary<string, object> data)
{
if (string.IsNullOrEmpty(templateContent))
throw new ArgumentException("Template content cannot be null", "templateContent");
var engine = new VelocityEngine();
engine.Init();
var context = GetContext(data);
using (var writer = new StringWriter()) {
engine.Evaluate(context, writer, "", templateContent);
return writer.GetStringBuilder().ToString();
}
}
И использовал StructureMap для инициализации сервиса:
ForRequestedType<ITemplateService>()
.TheDefault.Is.ConstructedBy(()=>
new NVelocityTemplateService(HttpContext.Current.Server.MapPath("~/Content/Templates/")));
Вы можете найти полезным компонент TemplateEngine.
Это абстракция над шаблонизаторами с реализацией NVelocity, похожая на ответ Дарина, но она должна работать незначительно лучше, поскольку использует один экземпляр VelocityEngine (в отличие от инициализации одного экземпляра для каждого рендера) и имеет дополнительное кэширование. Он также имеет несколько других функций, таких как ведение журнала, переопределение свойств NVelocity и загрузка шаблонов из ресурсов сборки.