我正在尝试使用asp.net核心MVC来构建一个Razor View,其字段的顺序与显然默认的字母顺序不同。我有一个简单的模型:
public class Application : EntityBase
{
[Display(Name = "Naam", Order = 1)]
public string Name { get; set; }
[Display(Name = "Omschrijving", Order = 2)]
public string Description { get; set; }
}
我希望脚手架在描述之前为Name生成一个字段。怎么做?
我一直试图在Razor模板中提出解决方案。相关代码是:
...
IEnumerable<PropertyMetadata> properties = Model.ModelMetadata.Properties;
foreach (var property in properties)
{
if (property.Scaffold && !property.IsPrimaryKey && !property.IsForeignKey)
{
...
我希望某个属性有一个Order属性,所以我可以编写像
这样的东西foreach (var property in properties.OrderBy(p => p.Order))
有什么想法吗?
答案 0 :(得分:1)
所以,经过一些(深入的)挖掘,我想出了一个解决方案。由于我已经定制了模板,因此可以添加另一个自定义。我最终创建了一个帮助类ScaffoldHelpers.cs:
public class ScaffoldHelpers
{
public static IEnumerable<PropertyMetadata> GetPropertiesInDisplayOrder(string typename, IEnumerable<PropertyMetadata> properties)
{
Type type = Type.GetType($"{typename}, {typename.Split('.')[0]}");
SortedList<string, PropertyMetadata> propertiesList = new SortedList<string, PropertyMetadata>();
foreach (PropertyMetadata property in properties)
{
int order = 0;
if (type != null)
{
var member = type.GetMember(property.PropertyName)[0];
var displayAttribute = member.GetCustomAttribute<System.ComponentModel.DataAnnotations.DisplayAttribute>();
if (displayAttribute != null)
{
order = displayAttribute.Order;
}
}
propertiesList.Add($"{order:000} - {property.PropertyName}", property);
}
return propertiesList.Values.AsEnumerable();
}
}
迭代所有属性,并确定是否指定了[Display()]属性。如果是这样,它将获取Order-parameter的值。如果您没有指定,则Order-property将为零。使用SortedList并确保按指定的顺序排列密钥,我能够轻松地按所需顺序返回IEnumerable<PropertyMetadata>
。
在模板中,我需要为此助手类添加@using
。之后,我可以在模板中插入以下内容:
...
IEnumerable<PropertyMetadata> properties = Model.ModelMetadata.Properties;
// added:
properties = ScaffoldHelpers.GetPropertiesInDisplayOrder(Model.ViewDataTypeName, properties);
foreach (var property in properties)
{
if (property.Scaffold && !property.IsPrimaryKey && !property.IsForeignKey)
{
...
那就是它!