获取脚手架以按特定顺序生成字段

时间:2016-11-10 15:06:52

标签: razor asp.net-core-mvc

我正在尝试使用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))

有什么想法吗?

1 个答案:

答案 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)
    {
...

那就是它!