您的位置:首页 > Web前端 > HTML

HtmlHelper 添加扩展方法. 使用Lambda表达式作为参数

2014-05-27 16:55 507 查看
1) 扩展方法: 扩展方法使您能够向现有类型“添加”方法,而无需创建新的派生类型、重新编译或以其他方式修改原始类型。扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用。

2) 扩展方法的特性

1:必须静态的,但它们是通过实例方法语法进行调用的。即:通过 "目标扩展类" 的事例调用的.

2:
它们的第一个参数指定该方法作用于哪个类型,并且该参数以 this 修饰符为前缀。

3:仅当您使用using 指令将命名空间显式导入到源代码中之后,扩展方法才位于范围中。 即: 使用之前,必须使用Using导入

3) 场景: HtmlHelper类,我们经常需要自定义一些扩展方法

事例:

[csharp] view plaincopyprint?




public static MvcHtmlString MyTestExtentFun(this HtmlHelper h)  

{  

    string str = "<a>asdasdasdasd</a>";  

    MvcHtmlString hs = new MvcHtmlString(str);  

    return hs;  

}  

然后页面调用就行了(别忘了引用其所在的名称空间)

[html] view plaincopyprint?




@{  

    ViewBag.Title = "主页";  

}  

@using MvcDDL;  

@Html.MyTestExtentFun()  

4) 扩展HtmlHelper类  如果页面是强类型的,可以使用lambda表达式传递参数

[csharp] view plaincopyprint?




using System;  

using System.Collections.Generic;  

using System.Linq;  

using System.Linq.Expressions;  

using System.Text;  

using System.Web;  

using System.Web.Mvc;  

using System.Web.Helpers;  

using System.Web.Mvc.Html;  

namespace MvcDDL  

{  

    public static class DdlClass  

    {  

  

  

        public static MvcHtmlString Test<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression)  

        {  

            /* 

             * 参数1: 

             this HtmlHelper<TModel> htmlHelper中的TModel,是存放所有页面数据的(包含:viewbag,viewdata,视图model)载体,其实视图model和viewdata是放一起的 

              

             此时,如果打断点,可发现,lambda的结果已经计算好了.存放在ViewData里面,我们可以通过元数据,查询拉姆达表达式获取结果值 

              

             *参数2 

             Expression<Func<TModel, TProperty>> expression  是拉姆达表达式(匿名函数,委托的变形),TModel是传入的数据类型一般指视图模型(eg:  m=>m.id )   TProperty 

             是返回的类型. 

               

               

             拉姆达表达式:expression.Body 是箭头左侧的那一段 

             MemberExpression  表示访问字段或属性。可以通过其获取字段的名称 

              

 

            */  

  

  

            //获取属性的名称  

            var exp = expression.Body as MemberExpression;  

            string expStr = exp.ToString();//形如 m.name  

            string id = expStr.Substring(expStr.IndexOf(".") + 1);  

              

            //获取lambda表达式的的结果值(属性值)  

            var value = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData).Model;  

  

  

  

            string str = " <select >";  

            str += str += "<option>------</option>";   

            str += " </select>";  

            MvcHtmlString hs = new MvcHtmlString(str);  

            return hs;  

        }  

  

    }  

}  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: