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

How to render ModelMetadata object using Html.Displar in Razor-engine in ASP.NET MVC app?

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

我扫描我的 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)

上面的代码有效 "in term of displaying the correct value" 但是它没有使用正确的 DisplayTemplate 导致格式不正确。

例如,我有一个名为 Currency.cshtml 的编辑器模板,它只显示 Model.ToString("C")。我还有另一个名为 Status.cshtml 的显示模板,它接受布尔值和 return "Active" 或 "Inactive"。两个显示模板都位于 ~/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 属性,其中包含 DataTypeAttribute 生成的值,对于您的 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; }