gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 23:43:31 25 4
gpt4 key购买 nike

问题描述

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

详细说明

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

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 个不同的 View ,其中每个属性的值都必须完整显示。 (有时针对每个实例,有时针对少数实例,有时针对一个实例)。

我可以手动列出每个属性访问权限
<td>@Html.DisplayFor(item.<Property>)</td>
对于每个 View 。

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

我可以使用反射来遍历 PropertyInfo 的列表,而不必使用
手动列出每个属性 <td>@property.GetValue(item)</td>

但是DisplayFor(x)不支持像 x=>property.GetValue(item) 这样复杂的表达式,意味着我丢失了将我的日期时间格式化为
的数据注释 01/01/1990
而不是
01-Jan-90 12:00:00 AM
并且可能还会导致丢失所有类型的注释,包括验证。

问题解决方案

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

  • [失败] 手动制作一个模拟 @property.GetValue(item) 功能的表达式
    [编辑]
  • [失败] 向 DisplayFor 传递表示属性访问器的 MethodInfo 对象 DisplayFor(x => property.GetGetMethod())以及.Invoke在 x 上运行它。
    [/编辑]
  • 照常手动检索值,并且
    • 在以this question 形式插入 View 元素之前,对其执行一个方法以手动检索和实现注释数据。建议,或
    • 根据需要在显示模板 View 中重新实现 DisplayFor 处理数据注释,并通过 DisplayFor 将其直接应用于值 this question建议
  • 重构 Model 类以仅包含“Prop”实例的列表(SortedList?),其中“Prop”是表示具有名称和值元素的属性的类。

这最后一个解决方案会把坏掉的
@Html.DisplayFor(m=>property.GetValue(item)
进入理论上可行的
@Html.DisplayFor(m=>item.Properties[i].Value)
除了通过 (.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# - ASP.NET MVC 使用数据注释迭代模型属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43859610/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com