Создание пользовательского помощника, доступного в представлениях - PullRequest
5 голосов
/ 05 февраля 2012

У меня слишком много текстовых утилит, таких как MakeShortText(string text, int length), RemoveTags(string text), TimeAgo(DateTime date) и другие.Я хочу получить к ним доступ из отдельного помощника, как в следующем примере:

@Text().MakeShortText(Model.Text, 10)

Возможно ли создать такое расширение?Или я должен сделать расширение для HtmlHelper следующим образом:

@Html.Text().MaksShortText(Model.Text, 10)

?

1 Ответ

11 голосов
/ 05 февраля 2012

Вы можете начать с определения пользовательского TextHelper:

public class TextHelper
{
    public TextHelper(ViewContext viewContext)
    {
        ViewContext = viewContext;
    }

    public ViewContext ViewContext { get; private set; }
}

и тогда все ваши методы будут методами расширения этого TextHelper:

public static class TextHelperExtensions
{
    public static IHtmlString MakeShortText(
        this TextHelper textHelper, 
        string text,
        int value
    )
    {
        ...
    }
}

Тогда вы можете определить пользовательскую веб-страницу:

public abstract class MyWebViewPage<T> : WebViewPage<T>
{
    public override void InitHelpers()
    {
        base.InitHelpers();
        Text = new TextHelper(ViewContext);
    }

    public TextHelper Text { get; private set; }
}

затем в вашей ~/Views/web.config ( не в ~/web.config) настройте эту пользовательскую веб-страницу в качестве базовой страницы для представлений Razor с помощью атрибута pageBaseType:

<pages pageBaseType="AppName.Web.Mvc.MyWebViewPage">
    <namespaces>
        <add namespace="System.Web.Mvc" />
        <add namespace="System.Web.Mvc.Ajax" />
        <add namespace="System.Web.Mvc.Html" />
        <add namespace="System.Web.Routing" />
    </namespaces>
</pages>

и тогда в ваших взглядах вы сможете использовать:

@Text.MakeShortText(Model.Text, 10)

И если вы хотите использовать следующий синтаксис, как показано в вашем вопросе:

@Text().MakeShortText(Model.Text, 10)

просто измените механизм пользовательского представления, чтобы Text не было свойством, а методом, который будет возвращать экземпляр TextHelper. Или даже вернуть экземпляр HtmlHelper, чтобы вам не нужно было перемещать существующие методы расширения в TextHelper:

public abstract class MyWebViewPage<T> : WebViewPage<T>
{
    public HtmlHelper Text()
    {
        return Html;
    }
}

Второй синтаксис также возможен:

@Html.Text().MaksShortText(Model.Text, 10)

Просто определите пользовательское расширение Text() для класса HtmlHelper:

public static class HtmlExtensions
{
    public static TextHelper Text(this HtmlHelper htmlHelper)
    {
        return new TextHelper(htmlHelper.ViewContext);
    }
}

и затем так же, как и в первом случае, ваши пользовательские методы будут методами расширения этого TextHelper класса.

...