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

    CSDN广告是越来越多了,所有博客笔记不再更新,新网址 DotNet笔记

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


2) 扩展方法的特性

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

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

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


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


事例:

        public static MvcHtmlString MyTestExtentFun(this HtmlHelper h)
        {
            string str = "<a>asdasdasdasd</a>";
            MvcHtmlString hs = new MvcHtmlString(str);
            return hs;
        }
然后页面调用就行了(别忘了引用其所在的名称空间)

@{
    ViewBag.Title = "主页";
}
@using MvcDDL;
@Html.MyTestExtentFun()

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

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;
        }

    }
}


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值