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;
}
}
}
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;
}
}
}
相关文章推荐
- HtmlHelper 添加扩展方法. 使用Lambda表达式作为参数
- ruby语言中代码块作为方法的参数使用
- ADO.NET使用带参数方法实现添加、删除和修改数据
- 对无返回值、使用Action或Func作为参数、多重载的方法进行单元测试
- 使用 Iisext.vbs 添加Web服务扩展文件的方法
- 类类型作为方法的参数时,使用 ref 和不使用ref的区别?
- 关于matlab使用函数作为参数的方法
- C# .net2.0中使用扩展方法和lambda表达式
- 结构变量作为方法的参数调用,在方法内部使用的“坑”你遇到过吗?
- 如何编码之使用接口作为方法的参数类型
- 为类库添加扩展方法的使用实例
- 使用74系列芯片作为I/O并行扩展的方法以及总线驱动芯片的使用方法
- 使用this作为方法的参数
- 终于找到了可以使用数组作为Oracle程序包参数的方法
- ibatis中使用List作为传入参数的使用方法
- 调试webservice遇到“测试窗体只能用于使用基元类型作为参数的方法”的解决办法
- 使用标量值函数作为主键自增值的时候,动软代码生成器的插入方法需要去掉主键的参数。
- 使用扩展方法,向现有类型“添加”方法
- java学习笔记(四)----对象、数组作为参数传递,静态变量、静态方法的使用,内部类,使用文档注释
- VS2012 Unit Test(Void, Action, Func) —— 对无返回值、使用Action或Func作为参数、多重载的方法进行单元测试