如何在ASP.NET MVC应用程序的Razor-engine中使用Html.Displar渲染ModelMetadata对象?

我正在尝试利用razor-engine中的DisplayTemplatesfunction自动渲染我的显示视图。

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

我试图像这样展示我的财产

 // 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")显示Model.ToString("C") 。 我还有另一个名为Status.cshtml显示模板,它接受布尔值并返回“活动”或“非活动”。 两个display-template都位于~/Views/Shared/DisplayTemplates

但由于某种原因, Html.DisplayFor()没有寻找合适的template 。 以下是我的一个视图模型的示例

 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; } } 

目前,我的视图显示Active属性的禁用复选框和我的Rate属性的非格式化数字。

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

ModelMetadata包含DataTypeName属性,该属性包含DataTypeName生成的值,对于Rate属性将为“Currency”,对于Status属性将为“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; }