2012-02-05 11 views
5

Mam zbyt wiele metod użyteczności tekstu, takich jak MakeShortText(string text, int length), RemoveTags(string text), TimeAgo(DateTime date) i innych. Chcę uzyskać do nich dostęp z oddzielnym pomocnika jak w następnym przykładzie:Tworzenie niestandardowego pomocnika dostępnego w widokach

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

Czy możliwe jest stworzenie takiego rozszerzenia? Lub muszę zrobić rozszerzenie dla HtmlHelper w ten sposób:

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

?

Odpowiedz

10

Można zacząć od zdefiniowania niestandardowego TextHelper:

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

    public ViewContext ViewContext { get; private set; } 
} 

i wtedy wszystkie metody są metodami przedłużenie tego TextHelper:

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

Następnie można zdefiniować niestandardową stronę internetową:

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

    public TextHelper Text { get; private set; } 
} 

następnie w swoim ~/Views/web.config (nie w ~/web.config) skonfigurować ten niestandardowej strony sieci Web jako strony podstawy dla swoich poglądów Razor stosując atrybut 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> 

a potem w widokach będzie można użyć:

@Text.MakeShortText(Model.Text, 10) 

a jeśli chciał użyć następującej składni, jak pokazano na zapytanie:

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

prostu zmodyfikować c Silnik widoku ustom tak, aby Text nie był właściwością, ale metodą, która zwróci instancję z TextHelper. Lub nawet powrócić instancję HtmlHelper, dzięki czemu nie trzeba przenieść istniejące metody rozszerzenie do TextHelper:

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

Druga składnia jest również możliwe:

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

Wystarczy zdefiniować niestandardową Text() rozszerzenie dla klasy HtmlHelper:

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

, a następnie w taki sam sposób, jak w pierwszym przypadku, gdy masz niestandardowe metody rozszerzenia metod tej klasy TextHelper.

+0

Dziękuję za tak dokładną i szczegółową odpowiedź. To było bardzo pomocne. Ale nie rozumiem, dlaczego potrzebuję parametr ViewContext w ctor TextHelper's? –

+1

@EvgenyLevin, dzięki czemu masz dostęp do 'HttpContext' w niestandardowych metodach rozszerzania. Rzeczy takie jak Żądanie, Odpowiedź, Sesja, RouteData, ... są zwykle przydatne w pomocniku. Można również wywoływać inne metody rozszerzenia, na przykład na przykład klasę HtmlHelper, taką jak TextBoxFor, ... Można oczywiście ją usunąć, jeśli jej nie potrzebujesz. –

+1

@DarinDimitrov dobra odpowiedź! +1 – dknaack

Powiązane problemy