2017-04-05 3 views
2

In ASP.Net Core MVC scheint das Bind Attribut nicht mehr die Exclude Eigenschaft zu haben. Angenommen, ich habe 20 Eigenschaften in meinem Modell, und ich möchte nur ein einzelnes Feld aus dem Modell für die Bearbeitungsfunktion zum Beispiel ausschließen, wird es wirklich unbequem sein, den Namen der 19 Eigenschaften einzugeben, um dieses einzelne Feld auszuschließen.Bind Attribut hat nicht `Exclude`, gibt es eine Arbeit um?

Der Punkt der Frage ist zu finden, ob Microsoft ein anderes Attribut für diesen Zweck hinzugefügt hat, oder etwas aus meiner Sicht versteckt ist, das dies tun kann.

Antwort

0

Ähnlich wie BindAttribute müssen Sie die Schnittstelle IPropertyFilterProvider implementieren.

Etwas wie folgt aus:

[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

Gut fix @rocky. Eine Frage, für was ist die Präfix-Eigenschaft? Ich sehe nicht, dass es von irgendeiner Schnittstelle benötigt wird, will nur sicher sein, dass es nicht vom Modellbinder oder etwas anderem benutzt wird, bevor es entfernt wird. – bocanegra

+0

Nicht genau, warum ich es aufgenommen habe ... vielleicht wurde es von woanders kopiert. Wie auch immer, nur die Eigenschaft 'Name' wird von einer der Schnittstellen benötigt, so dass es sicher sein sollte, sie zu löschen. Sie werden es früh genug herausfinden, wenn Sie es testen;) – rocky

Verwandte Themen