让脚手架按特定顺序生成字段

2024-02-23

我正在尝试让 asp.net core MVC 搭建 Razor 视图,其中字段的顺序与明显默认的字母顺序不同。我有一个简单的模型:

public class Application : EntityBase
{
    [Display(Name = "Naam", Order = 1)]
    public string Name { get; set; }

    [Display(Name = "Omschrijving", Order = 2)]
    public string Description { get; set; }
}

我希望脚手架在描述之前生成名称字段。这个怎么做?

我一直在尝试在 Razor 模板中提出解决方案。相关代码是:

...
IEnumerable<PropertyMetadata> properties = Model.ModelMetadata.Properties;
foreach (var property in properties)
{
    if (property.Scaffold && !property.IsPrimaryKey && !property.IsForeignKey)
    {
...

我希望一个属性有一个 Order-property,所​​以我可以写类似的东西

foreach (var property in properties.OrderBy(p => p.Order))

有任何想法吗?


因此,经过一番(深入)挖掘后,我想出了一个解决方案。由于我已经自定义了模板,因此添加另一个自定义是可以接受的。我最终创建了一个辅助类 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 参数的值。如果您不指定此项,则 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)
    {
...

就是这样!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

让脚手架按特定顺序生成字段 的相关文章

随机推荐