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

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


2) 扩展方法的特性

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

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

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


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


事例:

[csharp]  view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. public static MvcHtmlString MyTestExtentFun(this HtmlHelper h)  
  2. {  
  3.     string str = "<a>asdasdasdasd</a>";  
  4.     MvcHtmlString hs = new MvcHtmlString(str);  
  5.     return hs;  
  6. }  
然后页面调用就行了(别忘了引用其所在的名称空间)

[html]  view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. @{  
  2.     ViewBag.Title = "主页";  
  3. }  
  4. @using MvcDDL;  
  5. @Html.MyTestExtentFun()  

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

[csharp]  view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Linq.Expressions;  
  5. using System.Text;  
  6. using System.Web;  
  7. using System.Web.Mvc;  
  8. using System.Web.Helpers;  
  9. using System.Web.Mvc.Html;  
  10. namespace MvcDDL  
  11. {  
  12.     public static class DdlClass  
  13.     {  
  14.   
  15.   
  16.         public static MvcHtmlString Test<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression)  
  17.         {  
  18.             /* 
  19.              * 参数1: 
  20.              this HtmlHelper<TModel> htmlHelper中的TModel,是存放所有页面数据的(包含:viewbag,viewdata,视图model)载体,其实视图model和viewdata是放一起的 
  21.               
  22.              此时,如果打断点,可发现,lambda的结果已经计算好了.存放在ViewData里面,我们可以通过元数据,查询拉姆达表达式获取结果值 
  23.               
  24.              *参数2 
  25.              Expression<Func<TModel, TProperty>> expression  是拉姆达表达式(匿名函数,委托的变形),TModel是传入的数据类型一般指视图模型(eg:  m=>m.id )   TProperty 
  26.              是返回的类型. 
  27.                
  28.                
  29.              拉姆达表达式:expression.Body 是箭头左侧的那一段 
  30.              MemberExpression  表示访问字段或属性。可以通过其获取字段的名称 
  31.               
  32.  
  33.             */  
  34.   
  35.   
  36.             //获取属性的名称  
  37.             var exp = expression.Body as MemberExpression;  
  38.             string expStr = exp.ToString();//形如 m.name  
  39.             string id = expStr.Substring(expStr.IndexOf(".") + 1);  
  40.               
  41.             //获取lambda表达式的的结果值(属性值)  
  42.             var value = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData).Model;  
  43.   
  44.   
  45.   
  46.             string str = " <select >";  
  47.             str += str += "<option>------</option>";   
  48.             str += " </select>";  
  49.             MvcHtmlString hs = new MvcHtmlString(str);  
  50.             return hs;  
  51.         }  
  52.   
  53.     }  
  54. }  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值