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
.
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? –
@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. –
@DarinDimitrov dobra odpowiedź! +1 – dknaack