【发布时间】:2018-08-07 13:21:48
【问题描述】:
我正在尝试利用 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)
上面的代码“在显示正确的值方面”有效,但是它没有使用正确的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 对象?
【问题讨论】:
-
ModelMetadata包含一个DataTypeName属性,它应该为您提供DataType的值(您可以在DisplayFor()的第二个参数中使用它) -
@StephenMuecke 成功了!一如既往你的真棒。但这是显示属性的正确方法还是有更好的使用方法?
-
我认为这与您的 previous question 有关,您只希望看到
@model object的一个视图? -
@StephenMuecke 是的。除了 2 之外,我得到了一切工作。显示
ModelMetadata对象的正确方法。以及如何正确使用IMetadataAware将值添加到AdditionalValues到用实现IMetadataAware的属性装饰的属性中 -
只看到对我其他答案的评论。不知道你可能做错了什么,但稍后我会给你一个更详细的例子来说明它是如何工作的(会在那个答案中告诉你)。
标签: c# asp.net-mvc asp.net-mvc-5 razorengine display-templates