浅谈MVC中如何自定义HtmlHelper的过程
微软很贴心,就想贴心的小棉袄一样。微软提供的HtmlHelper已经是足够大部分开发人员使用了,但是有一些功能要用微软提供的HtmlHelper可能还不满足要求。接下来就谈谈如何自定义HtmlHelper的过程。
不知道其他开发者们,当你们在使用HtmlHelper对象的时候有没有留意过元数据。内部元数据如下图:
从上图可以得知,我们接下来要自定义的方法就是对HtmlHelper对象的扩展。
扩展方法实现的三要素:
1、静态类 2、静态方法 3、this关键字
1、先定义一个类,例如:MyHtmlHelper:
using System; using System.Collections.Generic; using System.Linq; using System.Web; namespace MvcApplicationFirstDome.Models { //静态类 public static class MyHtmlHelper { //静态方法 } }
2、假设要扩展的方式是GetSpan ,作用就是当你传入参数时,内部封装了之后返回结果,代码如下:注意在MyHtmlHelper类中要引用using System.Web.Mvc;命名空间
//静态方法 public static string GetSpan(this HtmlHelper htmlHelper,string text) { return "<span style='color:Red'>"+text+"</span>"; }
经过上面两步之后HtmlHelper的扩展方法GetSpan基本可以使用了,接下来就讲解如何在页面调用了。
在调用的时候要注意下一命名空间:如果扩展方法的命名空间和页面的命名空间不同的就必须引用扩展方法的命名空间,否则在页面是没有办法调用自定义的方法的。
引用命名空间的写法如下:
引用完命名空间之后,就可以在相应的页面调用自定义的扩展方法了。代码如下:
浏览的效果如下:
这里要先知道<%: %> 与 <%= %> 的区别,,冒号的是Encode 之后的,,等号的是直接输出的。
来到这里,就初步的完成了HtmlHelper的扩展方法了。
有没有发觉我们自己定义的扩展方法在调用的时候和微软本来提供的有什么区别呢?
1、需要引用命名空间
2、只能用<%= %>
大致的区别就是上面的两种了,那么接下来我们就来解决这两个问题,使我们自定义的方法也和微软的一样。
1、先解决<%= %>
当你们调用微软提供的方法的时候有没有发现它定义的方法的返回值类型呢?
我们之前的方法的返回值类型是 string ,所以接下来就重新定义一个返回值类型是 MvcHtmlString 的方法,代码如下:
public static MvcHtmlString GetSpanMVC(this HtmlHelper htmlHelper, string text) { return MvcHtmlString.Create("<span style='color:Red'>"+text+"</span>"); }
接下来页面测试代码:
效果如下图:
来到这里我们就解决了自定义的方法与微软的区别之一了,还有就是命名空间的问题了,
其实命名空间很容易解决,为什么微软的可以不用引用呢?他的命名空间是什么呢?我们的命名空间和微软的一样可以不呢?这一系列问题出来之后,我们就开始找微软的命名空间,把我们自定义的命名空间的改成与微软的一样试试看。
这个就不做解释了,自己可以找找就是 System.Web.Mvc.Html ,把我们之前的类的命名空间的名字改为这个之后,在页面的引用就可以去掉了。来到这里我们自定义的方法就基本和微软的一样了。