【问题标题】:Get scaffolder to generate fields in specific order获取脚手架以特定顺序生成字段
【发布时间】:2016-11-10 15:06:52
【问题描述】:

我正在尝试让 asp.net 核心 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))

有什么想法吗?

【问题讨论】:

    标签: razor asp.net-core-mvc


    【解决方案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 参数的值。如果您不指定此项,则 Order-property 将为零。使用 SortedList 并确保键按指定顺序排序,我可以轻松地以所需顺序返回 IEnumerable&lt;PropertyMetadata&gt;

    在模板中,我需要为这个助手类添加@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)
        {
    ...
    

    就是这样!

    【讨论】:

      猜你喜欢
      • 2011-10-18
      • 1970-01-01
      • 2011-11-07
      • 2022-11-10
      • 1970-01-01
      • 2023-02-18
      • 2012-04-07
      • 1970-01-01
      • 2014-12-02
      相关资源
      最近更新 更多