我正在尝试利用 razor-engine 中的 DisplayTemplates
功能自动呈现我的显示 View 。
我扫描我的 Model
以找到我想要显示的每个属性的正确 ModelMetadata
。但是我无法使用 Html.DisplayFor
正确呈现属性。
我试着像这样展示我的属性(property)
// 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
的显示模板,它接受 bool 值并返回“Active”或“Inactive”。两个显示模板都位于 ~/Views/Shared/DisplayTemplates
。
但出于某种原因,Html.DisplayFor()
并未寻找合适的模板
。这是我的一个 View 模型的示例
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; }
}
目前,我的 View 为 Active
属性显示了一个禁用的复选框,为我的 Rate
属性显示了一个未格式化的数字。
如何根据属性数据类型正确显示使用正确显示模板的 ModelMetadata
对象?
最佳答案
ModelMetadata
包含一个 DataTypeName
属性,该属性包含 DataTypeAttribute
生成的值,对于您的 而言该值为“Currency”为您的
属性和“状态”。您可以在 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; }
关于c# - 如何在 ASP.NET MVC 应用程序的 Razor 引擎中使用 Html.Displar 呈现 ModelMetadata 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51718933/