在MVC3 中给HtmlHelper 添加扩展(Extension)来消除魔鬼代码

本人多年没有写程序了,因为最近有个自己的网站要做,决定自己完成,最终选择了MVC3开发,感觉还可以,就把使用过程中的一些问题和心得写出来,跟网友交流,由于水平所限(非常初级),错误在所难免,水平高者和批评家请绕行,谢谢。

在MVC3 视图中经常需要使用Javascript代码,在JS代码中使用控件的话需要知道控件的名字,比如可以这样:

    function FirstPage() {
        var myCtrl = document.getElementsByName("CtrlName");
        ... ...
    }

 如果控件是这样生成的:

  @Html.TextBoxFor(m => m.CtrlName)

上面的JS代码可以正常运行,不会出什么问题。但是如果我再Model中把“CtrlName”修改为“CtrlName2”,VS2010编辑只能感知能够提示@Html.TextBoxFor(m => m.CtrlName) 的错,但是提示不了JS代码里面那个魔鬼字符串“CtrlName”。我就是不喜欢这种魔鬼代码,请不要说我变态,除此之外我也没有别的爱好了。既然不喜欢,我就一定要把这个代码去掉。如果在JS中写成这样:

function FirstPage() {
var myCtrl = document.getElementsByName("@Html.NameFor(m => m.CtrlName)");
... ...
}

就可以把那个魔鬼字符串去掉了。但是微软的MVC3框架的HtmlHelpper并没有提供NameFor这个方法,这就需要我们自己写一个HtmlHelper的扩展(Extension)来实现,具体什么是扩展,请自己查资料,水平所限,解释不清楚。添加步骤:

 1、建一个静态类HtmlHelperExtensions,类名可以自己随便起,其他的扩展也可以放在这个类里,所以这个类名也不错,并且Orchard CMS也是用的这个类名,所以我也用了(不好意思,我就这么没主见),name space可以是:Yourproject.Mvc.Html,在类里面添加一个静态方法 public static string NameFor<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression):

View Code
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Linq.Expressions;
using System.Web.Mvc;

namespace Yourproject.Framework.Mvc.Html
{
public static class HtmlHelperExtensions
{
public static string NameFor<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression)
{
return html.ViewData.TemplateInfo.GetFullHtmlFieldName(ExpressionHelper.GetExpressionText(expression));
}
}
}

内部实现代码return ExpressionHelper.GetExpressionText(expression), 这段代码从Orchard复制的,具体我也解释不清楚,水平有限,反正他能返回正确的名字,刚接触.net,委托神马的还比较糊涂,渴望有朝一日能得到名师指点。

2、这样C#代码就写好了。使用的时候我们需要在视图的顶上加上name space的引用:

@using WebBricks.Framework.Mvc.Html;

JS里面这样写:

function FirstPage() {
var myCtrl = document.getElementsByName("@Html.NameFor(m => m.CtrlName)");
... ...
}

就可以拿到控件的名字了。

取得Action名字等也可以用类似方式实现,这样可以满足一些有洁癖的程序员,大大减少程序中的魔鬼代码。

posted @ 2011-12-08 13:42  悠闲的水  阅读(4420)  评论(1编辑  收藏  举报