Razor不支持dynamic吗?

圣殿骑士18 2018-01-13 11:45:01
方法中返回的List<dynamic>
在view中循环取出,发现无法解析

public static List<dynamic> genChangeOutViewColumn()
{
List<dynamic> result = new List<dynamic>();
using (var context = new AppDbContext())
{
string valid = EnumValidStatus.Data1.GetEnumItemValue();
var list = context.sam_ba_changetype.Where(c => c.Direction == EnumDirection.Out.ToString() && c.Status == valid)
.OrderBy(c => c.SeqNo).ThenBy(c => c.TypeId).ToList();
for (int i = 0; i < list.Count(); i++)
{
result.Add(new { name = string.Format("TypeOut_{0}", i+1), label = list[i].ChangeName });
}

return result;
}
}


...全文
987 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
圣殿骑士18 2018-02-27
  • 打赏
  • 举报
回复
引用 14 楼 sp1234 的回复:
接口定义设计时不要乱用 dynamic 语法糖。dynamic 应该是在使用时才用的,作为一个功能方法的定义者,如果你连自己输出的数据的类型都不知道,那又何必要输出一个方法呢? 仅仅看
public static List<dynamic> genChangeOutViewColumn()
这个方法定义,应该作为不合格的定义,作为 bug 来看待。这里应该使用 List<含有具体功能内涵的类型> 作为输出参数声明,而不是随便声明 object 集合。
哈,说明一下,返回值用dynamic,是这个问题出现后,在调试过程中做各种修改和尝试的中间状态,不是原始代码。正式代码中并不会这么定义。
  • 打赏
  • 举报
回复
比如说我们干脆不返回 List<dynamic> 了而是返回 dynamic,有没有这种人?大有人在。一旦有一部分代码这样写了,整个系统的将来功能升级、bug修改和运行时的安全就乱了。
  • 打赏
  • 举报
回复
dynamic 是一个语法糖,而语法糖的目的当然就是替代我们写一些繁琐的代码。这是不可否认的。 但是任何事情都有底线、都有边界。使用技术的目的不是“行与不行”的问题,肯定是要找到真实的边界应该放到哪一个水平线上才刚刚合适。假设 c#和 .net 破坏了程序员世界的明确界限规则,而是很容易被滥用,那么最终我们扔掉的是 c# 和 .net,而不是扔掉我们的编程设计原则。所以 c# 应该会谨慎地设计语言,不会过于激进过于动态。
mirrorspace 2018-02-26
  • 打赏
  • 举报
回复
匿名对象集合弄成ExpandoObject类型的可以到VIEW里使用 .PropName出来.但object类型的不行. 但是发现,如果是一一个方法里写的匿名对象,可以 .PropName出来.如果返回给别的方法用,却不行
  • 打赏
  • 举报
回复
任何东西都有两面性,c# 和 .net 有越来越多的语法糖,那么“过与不及”都会产生bug。不是说不会某种编程语法才会产生bug,实际上“学的太多了”反而更反动。
  • 打赏
  • 举报
回复
举个例子,比如说代码
using System;
using System.Collections.Generic;
using System.Dynamic;

namespace ConsoleApp1
{
    class Program
    {
        static void Main()
        {
            dynamic r = x()[0];
            Console.WriteLine(r.b);
            Console.WriteLine("................按任意键结束");
            Console.ReadKey();
        }

        static List<ExpandoObject> x()
        {
            var r = new ExpandoObject();
            dynamic s = r;
            s.a = 1;
            s.b = "2";
            return new List<ExpandoObject> { r };
        }
    }
}
这里在使用时使用 dynamic 完全没有问题,在定义 x 函数时声明 List<ExpandoObject> 也非常正规。 如果声明 x 函数返回为 List<dynamic> 或者 List<object> 那么就应该看成是一个不负责任的设计了。
  • 打赏
  • 举报
回复
接口定义设计时不要乱用 dynamic 语法糖。dynamic 应该是在使用时才用的,作为一个功能方法的定义者,如果你连自己输出的数据的类型都不知道,那又何必要输出一个方法呢? 仅仅看
public static List<dynamic> genChangeOutViewColumn()
这个方法定义,应该作为不合格的定义,作为 bug 来看待。这里应该使用 List<含有具体功能内涵的类型> 作为输出参数声明,而不是随便声明 object 集合。
cy2889792 2018-02-26
  • 打赏
  • 举报
回复
强转就行了,或者不用变体类型
yzf86211861 2018-02-22
  • 打赏
  • 举报
回复
还是 用点 JS的 组件好, 微软的 这种东西 现在 了解的人太少 问谁 都没人 说的清楚.
正怒月神 版主 2018-02-22
  • 打赏
  • 举报
回复
你的情况就是 由于 dynamic包含了2级节点。
正怒月神 版主 2018-02-22
  • 打赏
  • 举报
回复
我没记错的话,dynamic在前台有2种情况。 具体原因看这个:http://blog.csdn.net/hanjun0612/article/details/53389993 里面也有解决方案。 不过创建实体类也是可以的。 但是我记不清,直接把dynamic替换为 var可不可以。楼主可以试一下。
圣殿骑士18 2018-02-21
  • 打赏
  • 举报
回复
当前解决方案,只能是定义POCO类返回。 此时,不论后台方法是用List<object>返回,还是用List<dynamic>返回,或者前台用dynamic item in ... 强转,就都可以了。 所以此问题不是dynamic是否在视图被支持的问题,而是匿名类在视图不被支持的问题。
圣殿骑士18 2018-02-21
  • 打赏
  • 举报
回复
引用 5 楼 thiefx 的回复:
[quote=引用 3 楼 daixf_csdn 的回复:] [quote=引用 1 楼 thiefx 的回复:] 和dynamic没关系吧?应该是你foreach里边,那一行最前边多一个 @ 被解析成创建一个object 但是object不包含label属性
不是 @ 而是 @: ,@:表示这一行是文本,而不是c#源代码。这没问题,必须这么写,否则后面一堆解析不了的特殊字符,比如单引号。[/quote] 学习了,之前没用过这个,那把 foreach里边 的强转一下也不行吗?(RepItemSummaryService.genChangeOutViewColumn() as List<dymamic>) 类似这样?[/quote] 是否强转没有关系。实际上,我定义成foreach(dynamic item in ... 已经是强转了。
圣殿骑士18 2018-02-21
  • 打赏
  • 举报
回复
引用 2 楼 caozhy 的回复:
dynamic没法绑定,可以用object
试过,后台用List<dynamic>返回和用List<object>返回,没有本质区别。本质上是因为我返回了匿名类型。 问题的原因,在这篇文章中有解释:匿名类型默认访问修饰符为internal http://blog.csdn.net/deboywang/article/details/6627191
thiefx 2018-01-15
  • 打赏
  • 举报
回复
引用 3 楼 daixf_csdn 的回复:
[quote=引用 1 楼 thiefx 的回复:] 和dynamic没关系吧?应该是你foreach里边,那一行最前边多一个 @ 被解析成创建一个object 但是object不包含label属性
不是 @ 而是 @: ,@:表示这一行是文本,而不是c#源代码。这没问题,必须这么写,否则后面一堆解析不了的特殊字符,比如单引号。[/quote] 学习了,之前没用过这个,那把 foreach里边 的强转一下也不行吗?(RepItemSummaryService.genChangeOutViewColumn() as List<dymamic>) 类似这样?
thiefx 2018-01-15
  • 打赏
  • 举报
回复
引用 3 楼 daixf_csdn 的回复:
[quote=引用 1 楼 thiefx 的回复:] 和dynamic没关系吧?应该是你foreach里边,那一行最前边多一个 @ 被解析成创建一个object 但是object不包含label属性
不是 @ 而是 @: ,@:表示这一行是文本,而不是c#源代码。这没问题,必须这么写,否则后面一堆解析不了的特殊字符,比如单引号。[/quote] 学习了,之前没用过这个,那把 foreach里边 的强转一下也不行吗?(RepItemSummaryService.genChangeOutViewColumn() as List<dymamic>) 类似这样?
thiefx 2018-01-14
  • 打赏
  • 举报
回复
和dynamic没关系吧?应该是你foreach里边,那一行最前边多一个 @ 被解析成创建一个object 但是object不包含label属性
圣殿骑士18 2018-01-14
  • 打赏
  • 举报
回复
引用 2 楼 caozhy 的回复:
dynamic没法绑定,可以用object
因为如图的智能提示,dynamic就是被解析为object的,而object不可能包含我要定义的属性,所以走不通。 如果我没理解错你的意思的话,也就是必须得定义强类型来解决问题了。 强类型是没问题,我后来只能是这么解决:
@foreach (TypeOutVm item in RepItemSummaryService.genChangeOutViewColumn())
                {
                    @:{ label: '@item.Label', name: '@item.Name', width: 100, align: 'left' },
                }
圣殿骑士18 2018-01-14
  • 打赏
  • 举报
回复
引用 1 楼 thiefx 的回复:
和dynamic没关系吧?应该是你foreach里边,那一行最前边多一个 @ 被解析成创建一个object 但是object不包含label属性
不是 @ 而是 @: ,@:表示这一行是文本,而不是c#源代码。这没问题,必须这么写,否则后面一堆解析不了的特殊字符,比如单引号。
threenewbee 2018-01-14
  • 打赏
  • 举报
回复
dynamic没法绑定,可以用object

62,052

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧