2017-04-05 71 views
2

在ASP.Net Core MVC中,Bind屬性似乎不再具有Exclude屬性。假設我的模型中有20個屬性,並且我只想從編輯功能的模型中排除單個字段,例如,鍵入19個屬性的名稱以排除單個字段將非常不方便。綁定屬性沒有`排除',是否有解決方法?

問題的關鍵在於要找到微軟是否爲此目的添加了任何其他屬性,或者我的視圖中隱藏了某些可以執行此操作的內容。

回答

0

BindAttribute類似,您必須實現IPropertyFilterProvider接口。

事情是這樣的:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Parameter, AllowMultiple = false, Inherited = true)] 
    public class ExcludeBindAttribute : Attribute, IModelNameProvider, IPropertyFilterProvider 
    { 
     private static readonly Func<ModelMetadata, bool> _default = (m) => true; 

     private Func<ModelMetadata, bool> _propertyFilter; 

     public string[] Exclude { get; } 

     public string Prefix { get; set; } 

     public ExcludeBindAttribute(params string[] exclude) 
     { 
      var items = new List<string>(); 
      foreach (var item in exclude) 
      { 
       items.AddRange(SplitString(item)); 
      } 

      Exclude = items.ToArray(); 
     } 

     public string Name 
     { 
      get { return Prefix; } 
     } 

     public Func<ModelMetadata, bool> PropertyFilter 
     { 
      get 
      { 
       if (Exclude != null && Exclude.Length > 0) 
       { 
        if (_propertyFilter == null) 
        { 
         _propertyFilter = (m) => !Exclude.Contains(m.PropertyName, StringComparer.Ordinal); 
        } 

        return _propertyFilter; 
       } 
       else 
       { 
        return _default; 
       } 
      } 
     } 

     private static IEnumerable<string> SplitString(string original) 
     { 
      if (string.IsNullOrEmpty(original)) 
      { 
       return Array.Empty<string>(); 
      } 

      var split = original.Split(',').Select(piece => piece.Trim()).Where(piece => !string.IsNullOrEmpty(piece)); 

      return split; 
     } 
    } 
+0

良好的修復@rocky。有一個問題,Prefix屬性用於什麼?我沒有看到它被任何接口需要,只是想確保它沒有被模型綁定器使用,或者其他東西在刪除它時使用。 – bocanegra

+0

不完全確定爲什麼我把它包括在內......也許它是從其他地方複製過來的。無論如何,只有'Name'屬性是其中一個接口所必需的,所以它應該是安全的。如果你測試它,你很快就會發現;) – rocky

相關問題