3

我正在尝试利用DisplayTemplatesrazor-engine 中的功能来自动渲染我的显示视图。

我扫描我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"). 我还有另一个名为的显示模板Status.cshtml,它接受布尔值并返回“活动”或“非活动”。两个显示模板都位于~/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根据属性数据类型正确显示使用正确显示模板的对象?

4

1 回答 1

1

ModelMetadata包含一个DataTypeName属性,其中包含由 生成的值DataTypeAttribute,这将是您的属性的“货币”和您的Rate属性的“状态” Status。您可以在的第二个参数中使用此值DisplayFor()

ModelMetadata columnMetadata = elementsMetadata.First(x => x.PropertyName == column.PropertyName);
string template = columnMetadata.DataTypeName;
Html.DisplayFor(x => columnMetadata.Model, template)

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

[Display(Name = "Status")] // use this rather that [DisplayName]
[UIHint("Status")]
public bool Active { get; set; }
于 2018-08-07T05:21:48.667 回答