应无所住,而生其心
排名
1
文章
860
粉丝
112
评论
163
net core webapi post传递参数
庸人 : 确实坑哈,我也是下班好了好几次,发现后台传递对象是可以的,但...
百度编辑器自定义模板
庸人 : 我建议换个编辑器,因为现在百度富文本已经停止维护了,用tinymec...
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术

扩展mvc实现model直接传递匿名对象

6209人阅读 2019/6/6 14:25 总访问:5185742 评论:0 收藏:0 手机
分类: .NET MVC


如果我们直接通过model传递匿名对象,是不行滴

后台通过model传递一个匿名对象

  1.  public ActionResult Index()
  2.  {
  3.       return View(new { username = "aaaa", age = 66 });
  4.  }

前台访问

  1. <div>
  2.     @Model.username
  3. </div>
  4. <div>
  5.     @Model.age
  6. </div>

然后就会看到正常的报错现象

这是因为匿名对象的作用域问题



下面我们扩展一下mvc自己实现这个功能

思路:重写View方法,把model传递的匿名对象进行反射处理,把反射后的值动态构建成一个dynamic就搞定了!


首先需要重写的方法就是这个,如果看源码就会发现其他那些view都会调用这个方法的,所以我们重写他。


首先看看实现代码

  1.  protected override ViewResult View(string viewName, string masterName, object model)
  2.         {
  3.             dynamic viewModel = new ExpandoObject();
  4.             //动态构建viewmodel
  5.             var dic = (IDictionary<stringobject>)viewModel;
  6.             //反射拿到属性
  7.             var porps = model.GetType().GetProperties();
  8.             foreach (var item in porps)
  9.             {
  10.                 //拿到属性的名字
  11.                 string name = item.Name;
  12.                 //拿到属性的值
  13.                 object value = item.GetValue(model);
  14.                 dic.Add(name, value);
  15.             }
  16.             //把动态构建的dynamic给到model
  17.             model = viewModel;
  18.             //调用刚父类的方法,当然也可以自己实现
  19.             return base.View(viewName, masterName, model);
  20.         }

然后看看效果


先把后端修改一下值,皮一下

  1. public ActionResult Index()
  2. {
  3.     return View(new { username = "剑哥", age = 666 });
  4. }

前台不用修改直接运行


 当然最好不要去修改view方法本身的逻辑,还是自己自定义一个viewresult来返回对象好 ,

暂时就先这样了,后面在补,HI去了







欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739。有需要软件开发,或者学习软件技术的朋友可以和我联系~(Q:815170684)

评价

扩展ef自动映射需要查询的字段(表达式树Expression),动态构建返回值

Entity Framework 动态构造select表达式比如我们需要返回某些字段会采用如下的写法但是发现每次都去写select如果字段很多不...

根据委托和lamdba表达式扩展方法

lamdba表达式ForEach扩展方法:public static void GetForEach&lt;T&gt;(this IEnumerable&lt;T&gt; list, Action&lt;T&gt;...

表达式树+反射扩展EF实现动态排序。List动态排序

我们在显示表格的时候经常会在点击表头的时候实现排序,当然很多前端的框架都实现了当前页的页面排序,直接配置一下就行了...

推荐Visual Studio好用的扩展插件(不定时更新)

嗨咯,大家好。什么是扩展?扩展是可以允许你在 Visual Studio 中进行自定义并增强在其中的体验的附加项,通过添加新功能或...

EF扩展反射实现动态排序+表达式树

现在各种网站上的表格可以通过点击排头来实现排序例如:今天我就来一探究竟,这是怎么实现的呢?具体步骤:我通过写扩展方...

表达式树+反射+扩展方法实现动态排序效果

后台代码如下:方法1:逐个判断 --&gt;缺点:代码重复,体验感差 if(sort.ToLower()==&quot;max&quot;) { if(sortway==...

.net Core3.0在Ubuntu 16.04上面的部署(Supervisor+nginx)(扩展docker)

前 言Linux 随着Linux越来越流行,本人一个.net程序员也多次研究linux与.net的相关产品,以及中间件的使用方式。So今天给...

字符串扩展方法

获取字符串的实际长度(按单字节) publicstaticintGetRealLength(thisstringsource) { returnSystem.Text.Encoding.Defau...

验证合法性扩展方法

Email格式是否合法 publicstaticboolIsEmail(thisstringsource) { returnRegex.IsMatch(source,@&quot;^\w+((-\w+)|(\.\...

扩展markdown增加mermaid支持画图

我看网上没有什么资料,只有说怎么去用它,没有说怎么才能用它。那就自己慢慢研究在让markdown支持,要自己实现这个必须要...

c扩展方法简单介绍

可以不用继承就可以给一个类增加方法!语法: Public static class 类名 { //你想添加的扩展方法 Public static ...

list扩展方法ForEach原理(where,FirstOrDefault同理!)

//ForEach的原理就是使用循环 //委托使用循环 publicstaticvoidMyForEach&lt;T&gt;(thisList&lt;T&gt;item,Action&lt;T...

特性扩展实体对象验证、枚举验证值是否正确

如果实体属性字段过多,几十,上百个,如果我们每个字段都去判断的话很麻,代码量很大,我们可以采用特性加枚举进行验证:1、...

Mybatis的SQL构建7 小小扩展+springboot

pom.xml的依赖,我是直接在spring.io官方下的,这样避免依赖冲突&lt;!--jdbc--&gt; &lt;dependency&gt; &lt;groupId&gt;o...

nlog扩展官方文档

https://nlog-project.org/2015/06/30/extending-nlog-is-easy.html