如何在ASP.NET MVC应用程序的Razor-engine中使用Html.Displar渲染ModelMetadata对象?
我正在尝试利用razor-engine中的DisplayTemplates
function自动渲染我的显示视图。
我扫描我的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; }