Die ModelBinder-Validierung bricht beim Getter mit Reflektion ab
Ich bin auf ein Problem gestoßen, das mit Reflektion und Modellbindervalidierung zu tun zu haben scheint, undFormatterParameterBinding.ExecuteBindingAsync(..)
Insbesondere und obwohl ich eine Methode verwenden kann, um das zu tun, was ich will, würde ich es vorziehen, wenn ich eine Eigenschaft verwenden könnte.
Hier möchte ich einen Einblick in den Modellbinder-Validierungsprozess bekommen, warum ich nicht in der Lage bin, das zu tun, was ich will, und wie ich das Problem beheben oder umgehen kann.
Die Einrichtung
public class ModelBindingValidationBreaker
{
public ModelBindingValidationBreaker()
{
Properties = new List<string>();
}
public int A { get; set; }
public int B { get; set; }
public IList<string> Properties { get; set; }
/*// Uncomment to break the model binder validation!
public IList<PropertyInfo> PropertyInfos
{
get
{
return GetType()
.GetProperties()
.Where(pi => Properties.Contains(pi.Name))
.ToList();
}
}//*/
public IList<PropertyInfo> GetPropertyInfos()
{
return GetType()
.GetProperties()
.Where(pi => Properties.Contains(pi.Name))
.ToList();
}
public IList<int> LetterCounts
{
get
{
return Properties.Select(p => p.Length).ToList();
}
}
}
Und ein Controller mit einer so definierten Nachaktion
public void Post(ModelBindingValidationBreaker breaker){...}
Nenne es mit dieser Art von Json:
{
"Properties": [
"A"
],
"A": 1,
"B": 2
}
Wenn Sie in die Aktion eintreten, können Sie sehen, dass der Breaker korrekt instanziiert ist und Sie können anrufenGetPropertyInfos()
ohne Probleme.
Wie es bricht
Wenn Sie jedoch die PropertyInfos-Eigenschaft auskommentieren, wird die Modellbindervalidierung unterbrochen. Ich habe einen einfachen Tracer hinzugefügt, um das herauszufinden. Es zeigt die folgende relevante Ausgabe:
System.Web.Http.Action: ApiControllerActionSelector;SelectAction;Selected action 'Post(ModelBindingValidationBreaker breaker)'
System.Web.Http.ModelBinding: HttpActionBinding;ExecuteBindingAsync;
System.Web.Http.ModelBinding: FormatterParameterBinding;ExecuteBindingAsync;Binding parameter 'breaker'
System.Net.Http.Formatting: JsonMediaTypeFormatter;ReadFromStreamAsync;Type='ModelBindingValidationBreaker', content-type='application/json'
System.Net.Http.Formatting: JsonMediaTypeFormatter;ReadFromStreamAsync;Value read='OverPostCount.Models.ModelBindingValidationBreaker'
System.Web.Http.ModelBinding: FormatterParameterBinding;ExecuteBindingAsync;
System.Web.Http.ModelBinding: HttpActionBinding;ExecuteBindingAsync;
System.Web.Http.Controllers: CustomController;ExecuteAsync;
System.Net.Http.Formatting: DefaultContentNegotiator;Negotiate;Type='HttpError', formatters=[JsonMediaTypeFormatterTracer, FormUrlEncodedMediaTypeFormatterTracer, FormUrlEncodedMediaTypeFormatterTracer]
Welche enthält diese Zeile stattdessen, wenn Sie die anstößigen get_PropertyInfos ausschließen:
System.Web.Http.ModelBinding: FormatterParameterBinding;ExecuteBindingAsync;Parameter 'breaker' bound to the value 'OverPostCount.Models.ModelBindingValidationBreaker'
HinzufügenDataContract
und verwandte Attribute wie[IgnoreDataMember]
on Properties behebt das Problem nicht. Auch nicht[Bind(Exclude="Properties")]
aus dem MVC-Namespace. Linq scheint da nicht das Problem zu seinLetterCount
unterbricht nicht die Modellbindervalidierung.
Meine Fragen
Warum unterbricht der PropertyInfos-Getter den Model Binder Validator?Ist dies ein Fehler in der Asp.NET-Web-API?Gibt es eine Möglichkeit, diesen Bruch durch Attribute, einen benutzerdefinierten Modellbinder-Validator, einen Service oder ähnliches zu verhindern?Grundsätzlich möchte ich die Modellbindungsüberprüfung nicht für die gesamte Klasse oder den gesamten Controller deaktivieren, aber wenn ich sie für die Properties-Eigenschaft deaktivieren könnte, wäre das großartig!