2016-11-10 51 views
1

我试图让asp.net核心MVC支架剃刀视图的字段以不同的顺序比明显默认的字母顺序。我有一个简单的模型:获取脚手架以特定的顺序生成字段

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

我希望属性有一个订单财产,所以我可以写的东西像

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

任何想法?

回答

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(); 
    } 

} 

此迭代,并且如果所指定的[显示()]属性确定。如果是这样,它将获得Order参数的值。如果你没有指定,Order属性将为零。使用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) 
    { 
... 

就是这样!