【问题标题】:How to render ModelMetadata object using Html.Displar in Razor-engine in ASP.NET MVC app?如何在 ASP.NET MVC 应用程序的 Razor 引擎中使用 Html.Displar 呈现 ModelMetadata 对象?
【发布时间】: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


【解决方案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)

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-14
    • 2011-03-11
    • 1970-01-01
    • 1970-01-01
    • 2011-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多