创建视图中可用的自定义帮助程序

Evg*_*vin 5 c# asp.net-mvc view-helpers razor asp.net-mvc-3

我有太多的文字实用的方法,如MakeShortText(string text, int length),RemoveTags(string text),TimeAgo(DateTime date)等.我想从单独的帮助器访问它们,如下例所示:

@Text().MakeShortText(Model.Text, 10)
Run Code Online (Sandbox Code Playgroud)

是否可以创建此类扩展?或者我必须像这样为HtmlHelper做扩展:

@Html.Text().MaksShortText(Model.Text, 10)
Run Code Online (Sandbox Code Playgroud)

Dar*_*rov 11

您可以从定义自定义开始TextHelper:

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

    public ViewContext ViewContext { get; private set; }
}
Run Code Online (Sandbox Code Playgroud)

然后让你所有的方法都是这个的扩展方法TextHelper:

public static class TextHelperExtensions
{
    public static IHtmlString MakeShortText(
        this TextHelper textHelper, 
        string text,
        int value
    )
    {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以定义自定义网页:

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

    public TextHelper Text { get; private set; }
}
Run Code Online (Sandbox Code Playgroud)

然后在~/Views/web.config(~/web.config)配置这个自定义网页作为基本页面使用你的剃须刀的观点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>
Run Code Online (Sandbox Code Playgroud)

然后在您的视图中,您将能够使用:

@Text.MakeShortText(Model.Text, 10)
Run Code Online (Sandbox Code Playgroud)

如果您想使用以下语法,如问题所示:

@Text().MakeShortText(Model.Text, 10)
Run Code Online (Sandbox Code Playgroud)

只需修改自定义视图引擎,使其Text不是属性,而是一个将返回该实例的方法TextHelper.或者甚至返回HtmlHelper实例,这样您就不需要将现有的扩展方法移动到TextHelper:

public abstract class MyWebViewPage<T> : WebViewPage<T>
{
    public HtmlHelper Text()
    {
        return Html;
    }
}
Run Code Online (Sandbox Code Playgroud)

第二种语法也是可能的:

@Html.Text().MaksShortText(Model.Text, 10)
Run Code Online (Sandbox Code Playgroud)

只需Text()HtmlHelper类定义自定义扩展:

public static class HtmlExtensions
{
    public static TextHelper Text(this HtmlHelper htmlHelper)
    {
        return new TextHelper(htmlHelper.ViewContext);
    }
}
Run Code Online (Sandbox Code Playgroud)

然后以与第一种情况相同的方式,您将自定义方法作为此类的扩展方法TextHelper.