微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c# – ASP.NET MVC使用数据注释迭代模型属性

问题描述

我的问题类似于this question,但不是通过反射(由ModelMetadata.displayName处理)将数据注释应用于属性Name我将它们应用于值(不由ModelMetadata处理).

详细说明

在ASP.NET MVC程序的上下文中.
假设我有一个Model类

public class Model
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string NickName { get; set; }
    public string Address { get; set; }
    public int Phone { get; set; }

    [display(Name = "Start Date")]
    [DataType(DataType.Date)]
    [displayFormat(ApplyFormatInEditMode = true,DataFormatString = "{0:dd/MM/yyyy}")]
    public DateTime StartDate { get; set }

    [display(Name = "End Date")]
    [DataType(DataType.Date)]
    [displayFormat(ApplyFormatInEditMode = true,DataFormatString = "{0:dd/MM/yyyy}")]
    public DateTime EndDate { get; set }
}

然后假设此模型用于至少5个不同的视图,其中每个属性的值必须完整显示. (有时候对于每一个例子,其他时间为少数,其他时间为一个).

我可以手动列出它自己的每个Property访问
< TD> @ Html.displayFor(项目<性>)< / TD>
对于每个视图.

但是,如果稍后Model的定义扩展为包含新属性(如描述,关系和可靠性),那对我没有帮助.然后我需要手动更新完整模型列表的每次出现.

我可以使用反射来迭代PropertyInfo的列表,并且不必通过使用手动列出每个属性
< TD> @ property.GetValue(项目)LT; / TD>

displayFor(x)不支持像x => property.GetValue(item)那样复杂的表达式,这意味着我丢失了将DateTime格式化为的数据注释
01/01/1990
代替
01年1月1日至上午12:00:00
并且可能还会导致丢失所有类型的注释,包括验证.

问题解决方案

到目前为止,我已经考虑(并在某些情况下尝试)以下解决方案:

> [失败]手动制作一个模仿@ property.GetValue(item)功能的Expression
[编辑]
> [失败]传递displayFor一个MethodInfo对象,表示Property Accessor displayFor(x => property.Getgetmethod())以及.在x上启动它.
[/编辑]
>正常手动检索值,然后

>对其执行一个方法,在插入视图元素之前手动检索并实现其上的注释数据,如this question所示,或
>在显示模板视图中根据需要重新实现displayFor处理数据注释,并通过displayFor将其直接应用于值,如this question所示

>重构Model类以仅包含’Prop’实例的列表(SortedList?),其中’Prop’是表示具有Name和Value元素的Property的类.

最后一个解决方案将破坏
@ Html.displayFor(M => property.GetValue(项目)
进入一个理论上有效的
@ Html.displayFor(M => item.Properties [I].价值)
除了稍微不直观地需要通过(.Value)获取名为Name(Properties [“Name”])的属性之外,这似乎是最可行的解决方案,代价是模型清晰度.

[编辑]
最近我创建了一个Utility方法,它从PropertyInfo中检索displayFormatAttribute,如果没有注释格式字符串,则返回displayFormatString或认值“{0}”.然后,我使用它在viewmodel中创建预格式化属性值的集合.
现在看来,这是我所知道的最优雅的方式,即尽可能地将View与模型分离,同时仍然从中检索必要的数据.
[/编辑]

问题

这是目前,纯粹是一个学习练习,但我想知道……
是否有可能在我失败的地方取得成功并且都有我的反射蛋糕并且也吃掉了数据注释?或者我必须寻求替代解决方案吗?
如果我必须寻求替代解决方案,是否有我错过的路线,或者我至少在正确的轨道上?

解决方法

也许类似于:

@foreach (var property in Model.GetType().GetProperties())
{
    <li>@property.GetValue(Model,null)</li>
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐