2012-11-29 12 views
21

Sto ricevendo il seguente VM su un Web API Messaggio azioneWeb API annullabile richiesto richiede attributo DataMember

public class ViewModel 
{ 
    public string Name { get; set; } 

    [Required] 
    public int? Street { get; set; } 
} 

Quando faccio un post ottengo il seguente errore:

Property 'Street' on type 'ViewModel' is invalid. Value-typed properties marked as [Required] must also be marked with [DataMember(IsRequired=true)] to be recognized as required. Consider attributing the declaring type with [DataContract] and the property with [DataMember(IsRequired=true)].

Sembra l'errore è chiaro, quindi voglio essere completamente sicuro che sia necessario utilizzare gli attributi [DataContract] e [DataMember] quando hai una classe con le proprietà nullable richieste.

C'è un modo per evitare di utilizzare questi attributi nell'API Web?

risposta

20

sto affrontando lo stesso problema come te, e penso che sia una totale assurdità. Con i tipi di valore posso vedere che [Required] non funziona poiché una proprietà con valore non può essere nullo, ma se hai un valore nullable, il numero non dovrebbe essere il problema. Tuttavia, la logica di convalida del modello API Web sembra trattare allo stesso modo tipi di valori non annullabili e nullable, quindi è necessario aggirarli. Ho trovato un lavoro in giro per il Web API forum e posso confermare che funziona: creare una sottoclasse ValidationAttribute e applicarla invece di RequiredAttribute sul valore tipizzato Null proprietà:

using System.Collections.Generic; 
using System.ComponentModel.DataAnnotations; 
using System.Web.Mvc; 

public class NullableRequiredAttribute : ValidationAttribute, IClientValidatable 
{ 
    public bool AllowEmptyStrings { get; set; } 

    public NullableRequiredAttribute() 
     : base("The {0} field is required.") 
    { 
     AllowEmptyStrings = false; 
    } 

    public override bool IsValid(object value) 
    { 
     if (value == null) 
      return false; 

     if (value is string && !this.AllowEmptyStrings) 
     { 
      return !string.IsNullOrWhiteSpace(value as string); 
     } 

     return true; 
    } 

    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context) 
    { 
     var modelClientValidationRule = new ModelClientValidationRequiredRule(FormatErrorMessage(metadata.DisplayName)); 
     yield return modelClientValidationRule; 
    } 
} 

NullableRequiredAttribute in uso:

public class Model 
{ 
    [NullableRequired] 
    public int? Id { get; set; } 
} 
+0

è passato un po 'di tempo da quando ho postato questa domanda e in realtà ho finito per fare quello che suggerisci, non capisco ancora perché web api funzioni in questo modo – jorgehmv

+3

@jorgehmv Lo considero un bug, fino a quando qualcuno non mi convince diversamente. – aknuds1

+0

Questo non è più un problema nella versione WebApi 2. Il bug sembra essere risolto. Semmai sono infastidito dal fatto che devo rendere gli attributi ViewModel nullable quando sto sottostando valori per Richiesto per restituire il messaggio di errore corretto. –

2

penso che si esegue lo stesso problema come discusso qui:

DataAnnotation for Required property

+0

Sì, ho trovato la stessa soluzione in seguito. Secondo me è un modo più elegante: puoi ancora utilizzare il validatore predefinito richiesto ora. –

0

Questo problema è stato risolto in Web Api 2. Tuttavia, l'interessante funziona solo se i campi sono proprietà con get/set.

Problemi correlati