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

C# 如何在ASP.NET MVC应用程序的Razor引擎中使用Html.dispar呈现ModelMetadata对象?,c#,asp.net-mvc,asp.net-mvc-5,razorengine,display-templates,C#,Asp.net Mvc,Asp.net Mvc 5,Razorengine,Display Templates,我正试图利用razor引擎中的DisplayTemplates功能来自动渲染我的显示视图 我扫描我的模型,为我要显示的每个属性找到正确的模型元数据。但是我无法使用Html.DisplayFor正确呈现属性 我试图这样展示我的财产 // First I find the ModelMetadata for the property // I call this statement in a loop and each iteration I pass a different PropertyNam

我正试图利用razor引擎中的
DisplayTemplates
功能来自动渲染我的显示视图

我扫描我的
模型
,为我要显示的每个属性找到正确的
模型元数据
。但是我无法使用
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”)
。我还有另一个名为
Status.cshtml
的显示模板,它接受布尔值并返回“Active”或“Inactive”。两个显示模板都位于
~/Views/Shared/DisplayTemplates

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

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; }
}
当前,“我的视图”为“活动”属性显示一个禁用的复选框,为“我的速率”属性显示一个未格式化的数字


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

ModelMetadata
包含
DataTypeName
属性,该属性包含由
DataTypeAttribute
生成的值,该值将为“货币”对于您的
费率
属性和您的
状态
属性的“状态”。您可以在
DisplayFor()的第二个参数中使用此值

另外请注意,您可以使用
uihintatAttribute
,例如,它还可以设置
DataTypeName
的值

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

ModelMetadata
包含一个
DataTypeName
属性,该属性应为您提供
DataType
的值(您可以在
DisplayFor()
的第二个参数中使用该属性)@StephenMuecke,该属性有效!和往常一样,你太棒了。但是,这是显示属性的正确方式还是有更好的方法可以使用?我认为这与您的相关,您只需要一个带有
@model object
的视图?@StephenMuecke是的。除了2个,我什么都有。显示
ModelMetadata
对象的正确方式。以及如何正确使用
IMetadataAware
将值添加到
AdditionalValues
属性中,该属性使用实现
IMetadataAware
的属性进行装饰,我在另一个答案中只看到了该注释。我不确定你可能做错了什么,但稍后我会给你一个更详细的例子,说明它是如何工作的(我会在答案中告诉你)。
[Display(Name = "Status")] // use this rather that [DisplayName]
[UIHint("Status")]
public bool Active { get; set; }