Я пишу некоторые декларативные Razor Helpers (с использованием синтаксиса @helper) для использования с Umbraco 4.7 , который теперь поддерживает механизм представления Razor (хотя я мог бы представить это применяется в равной степени к WebMatrix или ASP.NET MVC). Все они работают нормально. Тем не менее, я хотел бы сделать их немного более гибкими, чтобы я мог передать им фрагмент HTML, который можно «обернуть» вокруг вывода (но только при наличии вывода). Например, у меня есть помощник (очень упрощенный), который может генерировать HTML-ссылку из некоторых параметров:
@helper HtmlLink(string url, string text = null, string title = null,
string cssClass = null, bool newWindow = false)
{
if (!String.IsNullOrEmpty(url))
{
System.Web.Mvc.TagBuilder linkTag = new System.Web.Mvc.TagBuilder("a");
linkTag.Attributes.Add("href", url);
linkTag.SetInnerText(text ?? url);
if (!String.IsNullOrEmpty(title))
{
linkTag.Attributes.Add("title", title);
}
if (!String.IsNullOrEmpty(cssClass))
{
linkTag.Attributes.Add("class", cssClass);
}
if (newWindow)
{
linkTag.Attributes.Add("rel", "external");
}
@Html.Raw(linkTag.ToString())
}
}
Вызов @LinkHelper.HtmlLink("http://www.google.com/", "Google")
сгенерирует вывод HTML <a href="http://www.google.com/">Google</a>
.
Однако было бы неплохо, если бы я мог по желанию передать фрагмент HTML, который будет обернут вокруг сгенерированного гиперссылки HTML, если URL-адрес имеет значение. Я бы хотел сделать что-то вроде этого:
@LinkHelper.HtmlLink("http://www.google.com/", "Google", @<li>@link</li>)
и получите вывод
<li><a href="http://www.google.com/">Google</a></li>
или @LinkHelper.HtmlLink("", "", @<li>@link</li>)
и вообще не выводить.
Я читал в блоге Фила Хаакеда о шаблонных делегатах бритвы , но не могу понять, как их можно использовать в этом контексте - если это действительно возможно. У меня такое ощущение, что я что-то упускаю или лаю не на том дереве.