如何在 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; }
我正在尝试利用 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; }