编程语言
首页 > 编程语言> > c# – ASP.NET MVC使用数据注释迭代模型属性

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访问
&LT TD&GT @ Html.DisplayFor(项目<性>)&LT / TD&GT
对于每个视图.

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

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

但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 =&GT property.GetValue(项目)
进入一个理论上有效的
@ Html.DisplayFor(M =&GT 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>
}

标签:c,reflection,asp-net-mvc,data-annotations
来源: https://codeday.me/bug/20190710/1427905.html