Razor Helper

1、页面内 @helper(仅当前cshtml页面可用

在Razor视图页面内部定义辅助方法,只能在当前页面调用,不能跨页面复用。

@helper LinkStr(string who, string where)
{
    var res = who + "在" + where;
    @res
}

<!-- 调用 -->
<p>@LinkStr("Tom","LonDon")</p>Code language: HTML, XML (xml)

输出:<p>Tom在LonDon</p>

缺点:只能当前页面使用,其他视图无法调用。

2、自定义HtmlHelper扩展方法(全局,所有页面都能用

写独立C#类,做扩展方法,整个MVC项目所有Razor页面都可以通过Html.xxx()调用。

①新建类 CustomHelper.cs
using System.Web.Mvc;

namespace System.Web.Mvc.Html
{
    public static class CustomHelper
    {
        //示例1 返回普通字符串
        public static string Linkd(this HtmlHelper htmlHelper, string who, string where)
        {
            return who + "在" + where;
        }

        //示例2 返回Html标签,要用MvcHtmlString,防止html被转义
        public static MvcHtmlString Linkd(this HtmlHelper htmlHelper, string text, string url)
        {
            return new MvcHtmlString(string.Format("<a href='{0}'>{1}</a>", url, text));
        }
    }
}Code language: JavaScript (javascript)

关键点:

  1. 命名空间放到 System.Web.Mvc.Html,页面不用额外using
  2. 方法参数第一个:this HtmlHelper htmlHelper 标记这是Html扩展方法
  3. 返回html标签要返回MvcHtmlString,不然<a>标签会被转义成文本
②视图页面调用
@Html.Linkd("Jack","HongKong")

@Html.Linkd("Google","https://www.foxdevelop.com")Code language: JavaScript (javascript)

两者对比

方式定义位置调用方式作用范围
@helpercshtml视图内部@方法名()仅限当前页面,不能跨页面
Html扩展方法独立C#类@Html.方法名()全局所有视图,推荐项目公用逻辑

注意:.NET Core / .NET5+ Razor 已经移除了 @helper 语法,只支持扩展方法@helper 只存在老的ASP.NET MVC5。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注