mvc3里,razor怎么显示模型里的一个集合属性的某个属性的DataAnnotations?

hztltgg 2014-09-28 05:11:25
就是一个类Student,有属性Name

<Display(Name:="姓名")>
Public Property Name As String

视图模型是
Public Class StudentListViewModel

Public Property Students As IEnumerable(Of Student)

End Class

在View里怎么不直接写死,自动显示姓名两个字?

@For Each p In Model.Students
<h4> 姓名 @p.Name</h4>
Next

不是集合的时候是可以直接
@Html.LabelFor(Function(x) x.Student.Name)
实现的。


...全文
351 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
用FirstOrDefault,不然集合一条数据都没叫报错了~~~。
  • 打赏
  • 举报
回复
可以直接在model类里面定义一个Name。 就不用去集合里面取了 反正c#是可以这么写
@Html.LabelFor(x => x.ListStudent.First().Name)

@Html.LabelFor(x =>Model.ListStudent.First().Name)
不是集合可以直接点它Name,是集合那就集合随便取第一条student对象再点Name~~
threenewbee 2014-09-29
  • 打赏
  • 举报
回复
引用 9 楼 hztltgg 的回复:
[quote=引用 8 楼 caozhy 的回复:] 说白了,这些扩展方法本身就不常用——因为做页面是美工的事情。他们可不会写这些代码。 这些扩展方法仅仅是作为脚手架快速产生一个原型。
那这么说,在属性上写<Display(Name:="姓名")>本身也没什么意义?[/quote] Attribute是一种更好的注释,就算不用,写着也可以增加可用性。
  • 打赏
  • 举报
回复
我用的纯html,前端写好了,我就只负责数据 。。。
threenewbee 2014-09-29
  • 打赏
  • 举报
回复
程序员(确切地说是业务分析师)负责搞清楚交互、字段这些事情。 一般是这么做,程序员用脚手架代码产生一个粗陋的交互原型。 然后美工设计页面,替换脚手架代码。
hztltgg 2014-09-29
  • 打赏
  • 举报
回复
在开发的时候还能获得提示。
hztltgg 2014-09-29
  • 打赏
  • 举报
回复
引用 10 楼 caozhy 的回复:
[quote=引用 9 楼 hztltgg 的回复:] [quote=引用 8 楼 caozhy 的回复:] 说白了,这些扩展方法本身就不常用——因为做页面是美工的事情。他们可不会写这些代码。 这些扩展方法仅仅是作为脚手架快速产生一个原型。
那这么说,在属性上写<Display(Name:="姓名")>本身也没什么意义?[/quote] Attribute是一种更好的注释,就算不用,写着也可以增加可用性。[/quote]
引用 11 楼 qzyf1992 的回复:
[quote=引用 9 楼 hztltgg 的回复:] [quote=引用 8 楼 caozhy 的回复:] 说白了,这些扩展方法本身就不常用——因为做页面是美工的事情。他们可不会写这些代码。 这些扩展方法仅仅是作为脚手架快速产生一个原型。
那这么说,在属性上写<Display(Name:="姓名")>本身也没什么意义?[/quote] 在基于反射的框架用的上 很多时候表示一种特性。如果你写框架很有用。框架经常反射出一个类的所有方法找到 其带Display的Attribute然后对他进行一些特殊的操作[/quote] 我的意思是在开发mvc网站的时候,类似定义Name的中文含义姓名,这个职责应该是前台美工?还是后台程序员?还是两者各管各的?如果前台不需要用脚手架,那Attribute的注释我觉得还不如用///或者’‘’的说明注释,在开发的时候还能获得提升。
qzyf1992 2014-09-29
  • 打赏
  • 举报
回复
引用 9 楼 hztltgg 的回复:
[quote=引用 8 楼 caozhy 的回复:] 说白了,这些扩展方法本身就不常用——因为做页面是美工的事情。他们可不会写这些代码。 这些扩展方法仅仅是作为脚手架快速产生一个原型。
那这么说,在属性上写<Display(Name:="姓名")>本身也没什么意义?[/quote] 在基于反射的框架用的上 很多时候表示一种特性。如果你写框架很有用。框架经常反射出一个类的所有方法找到 其带Display的Attribute然后对他进行一些特殊的操作
hztltgg 2014-09-28
  • 打赏
  • 举报
回复
引用 8 楼 caozhy 的回复:
说白了,这些扩展方法本身就不常用——因为做页面是美工的事情。他们可不会写这些代码。 这些扩展方法仅仅是作为脚手架快速产生一个原型。
那这么说,在属性上写<Display(Name:="姓名")>本身也没什么意义?
threenewbee 2014-09-28
  • 打赏
  • 举报
回复
说白了,这些扩展方法本身就不常用——因为做页面是美工的事情。他们可不会写这些代码。 这些扩展方法仅仅是作为脚手架快速产生一个原型。
hztltgg 2014-09-28
  • 打赏
  • 举报
回复
引用 5 楼 caozhy 的回复:
你要愿意,可以模仿LabelFor写一个LabelForItem,如果你用得多的话。 的确LabelFor做不到,也没有好办法,或者你的View模型绑定给IEnumerable<Student>而不是Student
我觉得这是一个很常用的功能把,既然模型里已经标记了display,又在list的视图里再写一次,明显不太合理。扩展方法的话,似乎也是不对的,labelfor是扩展html类,参数是model,我使用的话,如果model是集合,逻辑上又有问题了,是写个函数, GetDisplay("Student.Name") 这样调用?感觉很不优雅
threenewbee 2014-09-28
  • 打赏
  • 举报
回复
LabelFor就是用的反射,你可以看下源代码。
threenewbee 2014-09-28
  • 打赏
  • 举报
回复
你要愿意,可以模仿LabelFor写一个LabelForItem,如果你用得多的话。 的确LabelFor做不到,也没有好办法,或者你的View模型绑定给IEnumerable<Student>而不是Student
hztltgg 2014-09-28
  • 打赏
  • 举报
回复
引用 1 楼 qzyf1992 的回复:

          Type type = GetType(this);
            MethodInfo info = type.GetMethod("");
            Display[] attrs = (Display[])info.GetCustomAttributes(typeof(Display));
            return attrs[0].Name;
这是反射去特性值,我是想在mvc的模型里的集合里简单的取出来,不合适用啊
hztltgg 2014-09-28
  • 打赏
  • 举报
回复
引用 2 楼 caozhy 的回复:
Imports System.ComponentModel.DataAnnotations

Class Student
    <Display(Name:="姓名")>
    Property Name As String

    <Display(Name:="年龄")>
    Property Age As String
End Class

Module Module1

    Sub Main()
        Dim s As New Student
        s.Name = "张三"
        s.Age = 20

        For Each item In s.GetType.GetProperties
            Dim fieldname = CType(item.GetCustomAttributes(GetType(DisplayAttribute), False)(0), DisplayAttribute).Name
            Dim value = item.GetValue(s, Nothing)
            Console.WriteLine(fieldname & ": " & value)
        Next

    End Sub

End Module
姓名: 张三 年龄: 20 请按任意键继续. . .
这是反射,我明白,我是想说,在mvc里,强类型的视图,LabelFor这些是已经实现显示display特性了,放到集合里就不知道通过什么简单的方法实现?作为一个集合属性,似乎实现类似labelfor这样的扩展方法也不合适,是不是设计就有问题?集合里不应该直接取特性?
threenewbee 2014-09-28
  • 打赏
  • 举报
回复
Imports System.ComponentModel.DataAnnotations

Class Student
    <Display(Name:="姓名")>
    Property Name As String

    <Display(Name:="年龄")>
    Property Age As String
End Class

Module Module1

    Sub Main()
        Dim s As New Student
        s.Name = "张三"
        s.Age = 20

        For Each item In s.GetType.GetProperties
            Dim fieldname = CType(item.GetCustomAttributes(GetType(DisplayAttribute), False)(0), DisplayAttribute).Name
            Dim value = item.GetValue(s, Nothing)
            Console.WriteLine(fieldname & ": " & value)
        Next

    End Sub

End Module
姓名: 张三 年龄: 20 请按任意键继续. . .
qzyf1992 2014-09-28
  • 打赏
  • 举报
回复

          Type type = GetType(this);
            MethodInfo info = type.GetMethod("");
            Display[] attrs = (Display[])info.GetCustomAttributes(typeof(Display));
            return attrs[0].Name;

62,025

社区成员

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

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

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

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