c# - 如何在 ASP.NET MVC 应用程序的 Razor 引擎中使用 Html.Displar 呈现 ModelMetadata 对象?

标签 c# asp.net-mvc asp.net-mvc-5 razorengine display-templates

我正在尝试利用 razor-engine 中的 DisplayTemplates 功能自动呈现我的显示 View 。

我扫描我的 Model 以找到我想要显示的每个属性的正确 ModelMetadata。但是我无法使用 Html.DisplayFor 正确呈现属性。

我试着像这样展示我的属性(property)

// First I find the ModelMetadata for the property
// I call this statement in a loop and each iteration I pass a different PropertyName to get the correct model
ModelMetadata columnMetadata = elementsMetadata.First(x => x.PropertyName == column.PropertyName);

// I attempted to render the columnMetadata object like so
Html.DisplayFor(x => columnMetadata.Model)

上面的代码“在显示正确值方面”有效,但是它没有使用正确的 DisplayTemplate,这导致格式不正确。

例如,我有一个名为 Currency.cshtml 的编辑器模板,它只显示 Model.ToString("C")。我还有另一个名为 Status.cshtml 的显示模板,它接受 bool 值并返回“Active”或“Inactive”。两个显示模板都位于 ~/Views/Shared/DisplayTemplates

但出于某种原因,Html.DisplayFor() 并未寻找合适的模板。这是我的一个 View 模型的示例

public class ViewModel
{
    public string Name { get; set; }

    [DataType(DataType.Currency)]
    public decimal Rate { get; set; }

    [DataType("Status"), DisplayName("Status")]
    public bool Active { get; set; }
}

目前,我的 View 为 Active 属性显示了一个禁用的复选框,为我的 Rate 属性显示了一个未格式化的数字。

如何根据属性数据类型正确显示使用正确显示模板的 ModelMetadata 对象?

最佳答案

ModelMetadata 包含一个 DataTypeName 属性,该属性包含 DataTypeAttribute 生成的值,对于您的 而言该值为“Currency”为您的 Status 属性评价 属性和“状态”。您可以在 DisplayFor()

的第二个参数中使用该值
ModelMetadata columnMetadata = elementsMetadata.First(x => x.PropertyName == column.PropertyName);
string template = columnMetadata.DataTypeName;
Html.DisplayFor(x => columnMetadata.Model, template)

另请注意,您可以使用 UIHintAttribute,它也设置 DataTypeName 的值,例如

[Display(Name = "Status")] // use this rather that [DisplayName]
[UIHint("Status")]
public bool Active { get; set; }

关于c# - 如何在 ASP.NET MVC 应用程序的 Razor 引擎中使用 Html.Displar 呈现 ModelMetadata 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51718933/

相关文章:

c# - 为 (CheckedListBox).Items.Add() 使用自定义对象

c# - 使用 json 数组和 json 对象的优缺点

asp.net-mvc - UnityMvcActivator 中缺少 FilterAttributeFilterProvider

c# - 如何在 Win7 中断开蓝牙设备与 C# .Net 的连接

c# - Humanizer 无法在 C# 中对意大利语单词进行单数化或复数化

c# - 重构 switch 语句,根据情况分配不同的变量?

asp.net-mvc - 在 ASP.NET MVC3 中将复杂对象作为参数发送到 Post Action

asp.net-mvc - 在 asp.net mvc 绑定(bind)中使用 Include 和 Exclude 或创建一个新的子集对象?

c# - 如何从 VS2013 为基于 ADO.Net 的存储库编写单元测试代码

c# - View 序列化时链接中断