zoukankan      html  css  js  c++  java
  • 在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名字等也可以用类似方式实现,这样可以满足一些有洁癖的程序员,大大减少程序中的魔鬼代码。

  • 相关阅读:
    Tiny64140之初始化时钟
    Tiny6410之控制icache驱动
    Tiny6410之按键裸机驱动
    Linux -- man 、info、 whatis、 -h
    Linux -- which whereis
    Linux -- sudoers (简单:转)
    Linux -- sudo
    Linux -- sudoers文件
    Linux -- cp
    Linux -- mv
  • 原文地址:https://www.cnblogs.com/idlewater/p/2280585.html
Copyright © 2011-2022 走看看