2016-07-21 2 views
2

Sagen wir, dass ich ein einfaches Modell mit dem erforderlichen Attribut oberhalb der Eigenschaft habe.ASP.NET RC2 - ModelState validiert Elemente der Auflistung nicht

Wenn ich POST/PUT nur eine Instanz von Benutzer und Name leer ist, funktioniert es ziemlich gut. ModelState ist nicht gültig und enthält einen Fehler.

Wenn ich POST/PUT Sammlung von Objekten Benutzer und in einigen von ihnen Name ist leer, dann ModelState ist gültig und es enthält keine Validierungsfehler.

Können Sie mir sagen, was daran falsch ist und warum es nur Sammlungen betrifft? Ich habe dasselbe Verhalten bemerkt, wenn ich ein Objekt mit der Beziehung Eins-Viele habe. Die Sammlung in diesem Objekt wird auch nicht von ModelState überprüft.

Ich möchte die erforderlichen Felder nicht manuell validieren, es sollte automatisch funktionieren.

+0

Validation ist Eigentum-Ebene gibt es eine Abhilfe, die Sie die Sammlung in ein Modell setzen können Ein Besitz. – Takahiro

Antwort

-1

Sie benötigen eine Action

public class ModelStateValidActionFilter : IAsyncActionFilter 
{ 
    public Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next) 
    { 
     // Validate ICollection 
     if (context.ActionArguments.Count == 1 && context.ActionArguments.First().Value.GetType().IsListType()) 
     { 
      foreach (var arg in (IList)context.ActionArguments.First().Value ) 
      { 
       var parameters = arg.GetType().GetProperties(); 
       foreach (var parameter in parameters) 
       { 
        var argument = context.ActionArguments.GetOrDefault(parameter.Name); 
        EvaluateValidationAttributes(parameter, argument, context.ModelState); 
       } 
      } 
     } 

     if (context.ModelState.IsValid) 
     { 
      return next(); 
     } 
     context.Result = new BadRequestObjectResult(context.ModelState); 
     return Task.CompletedTask; 
    } 

    private void EvaluateValidationAttributes(PropertyInfo parameter, object argument, ModelStateDictionary modelState) 
    { 
     var validationAttributes = parameter.CustomAttributes; 
     foreach (var attributeData in validationAttributes) 
     { 
      var attributeInstance = parameter.GetCustomAttribute(attributeData.AttributeType); 
      var validationAttribute = attributeInstance as ValidationAttribute; 
      if (validationAttribute != null) 
      { 
       var isValid = validationAttribute.IsValid(argument); 
       if (!isValid) 
       { 
        modelState.AddModelError(parameter.Name, validationAttribute.FormatErrorMessage(parameter.Name)); 
       } 
      } 
     } 
    } 

zu erstellen und es in Ihre MVC Optionen hinzufügen

services.AddMvc() 
    .AddMvcOptions(opts => 
    { 
     opts.Filters.Add(new ModelStateValidActionFilter()); 
    } 
+1

Wie löst dies das Problem der Validierung der Sammlung? – Thomas

+0

Wenn die Auflistung eine Eigenschaft ist, können Sie IValidatableObject implementieren, um sie zu validieren. Es scheint jedoch, dass eine Stammsammlung nicht validiert werden kann. Die Validierung gilt nur für Eigenschaften auf Eigenschaftsebene. – Takahiro

+0

Ich kann nicht glauben, dass es nicht automatisch funktioniert. Wenn wir das Modell, z. B. den Benutzer, verschachtelt haben, der eine Addresse als Eigenschaft und Addres eine leere erforderliche Eigenschaft hat, erhalten wir einen Fehler. Es muss etwas mit Sammlungen geben ... – Ellbar

Verwandte Themen