2016-11-10 67 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) 
    { 
... 

就是這樣!