代码改变世界

MVC之HtmlHelper

2012-11-20 20:18  追梦人001  阅读(1277)  评论(1编辑  收藏  举报

  以前总是在园子里面看人家写的文章,有些文章的确给自己很大帮助,今天索性也写一点小东西拿出来给大家分享。第一次写,望大牛们勿喷!

  最近这段时间公司比较清闲,时间宽裕,然后便自学MVC。看了看MVC后发现原来前台和后台可以这么无厘头的分开啊!(好吧我承认,我的确out的很离谱!) MVC三个组成部分:Model 、View、Controller。今天主要想和大家分享的是View这一块。微软的MVC摒弃了之前的aspx页面的拖拖控件就能搞定的理念,因为发现那样会把程序员惯成傻子,而做出来的网站毫无性能可言,慢的像猪头!所以在展示页面View这一部分的操作几乎就是纯手工写html代码了。这对于程序员来说也挺苦恼的,因为从轻松拖控件直接升级为纯手工写代码(当然,可能难度不大,但是其中的麻烦是不可言喻的)。幸好微软推出了HtmlHelper,方便了我们写html代码,大大提高了效率。

  何为HtmlHelper?HtmlHelper也好SQLHelper也好,说白了就是把很多代码封装起来,然后供我们调用,用于节省开发时间,降低错误率。好了闲言少叙,开始正题;如果我们用MVC做一个简单的文章回复功能,View层中写一个TextBox一个TextArea一个Submit按钮,TextBox写标题TextArea写内容然后一点Submit就可以搞定了,这样看起来没什么问题。但是想一想如果在提交回复时出现了错误,没提交成功。按道理说在TextBox和TextArea中应该还保存刚才我们写的内容的,但是可惜View层中已经没有了ViewState。于是乎悲催的事情发生了,我们写了半天的评论,一点按钮,一个小错误没成功,回来后啥都没了,傻眼了!这样该怎么办呢?好办啊!在Controller里面给控件赋值不就可以了吗?想法很好,但可惜MVC模式中Controller操作View中的控件是犯法的!这怎么办?于是乎htmlhelper应运而生! 在View中将手写的TextBox和TextArea删掉,然后用HtmlHelper,具体代码如下:标题: <%:Html.TextBox("txtTitle","txtTitle") %>评论内容: <%:Html.TextArea("txtContent") %>这两个尖括号里里面的东西就是HtmlHelper了。以第一个为例:先写尖括号百分号然后是冒号,但是我们知道啊在WebForm时代,我们也这样在html里面加C#代码但是百分号后面往往是等号,那冒号和百分号的区别是什么呢?诸位可以试一下,冒号包裹的内容如果含有尖括号等的html标签,会识别出来。而等号不识别而是直接把内容显示出来。Html.TextBox里面的参数,第一个是该TextBox的Name属性,第二个是Value属性,当然还可以设置它的样式了 <%:Html.TextBox("txtTitle", "txtTitle", new { disable="none",....})%>大括号里面写属性,多个时用逗号隔开。在Controller里面可以通过ViewData["txtTitle"]进行取值和赋值。这样子一个HtmlHelper基本上就出炉了。

  当然有很多公司都有自己的HtmlHelper,然后今天就研究了一下,应该怎样写出自己的HtmlHelper,然后查看代码发现了所谓的每一个控件的HtmlHelper其实就是分别写一个类然后对HtmlHelper进行扩展,然后便写了一个扩展的类实现了一个特殊的Span标签的展示。具体方法如下:新建一个类,命名为SpanExtensions这个类是一个静态类,Public Static Class SpanExtensions  里面写一个方法,GetSpan方法,当然这也是一个静态方法,同时实现对HtmlHelper的扩展,还需要传入一个里面显示内容的参数具体代码如下:

 public static string GetLabel(this HtmlHelper helper, string txt)  

  {            

            return string.Format("<span style='color:red'>{0}</span>", txt);

}

  这样在前面的View里面用Htmlhelper调用的时候发现没有,怪了,明明写了的,后来发现原来是SpanExtensions类的命名空间和View不一样,我想引用然后发现如果以后用这个方法的地方很多就太麻烦了,然后就直接把SpanExtensions的命名空间改为View的命名空间,然后就找到了,写完后一运行!发现:亲娘来,连html标签都出来了,难不成还得转?后来看了看HtmlHelper里面的TextBox发现返回值不一样,它的返回值是一个MvcHtmlString类型,啥东西啊?没见过!于是我就想把MvcHtmlString这个东西和String能够联系起来,后来整出来了,代码如下:  MvcHtmlString mc = MvcHtmlString.Create(string.Format("<span style='color:red'>{0}</span>", txt)); 这样直接返回mc就可以搞定了!

  第一篇文章,真心的希望能够对初学MVC的同志有所帮助吧!