2015-07-16 15 views
10

Problema SfondoRimuovere eccezioni JSON.net serializzazione dal ModelState

Per salvare me stesso da duplicare la logica di convalida sto seguendo un modello di spingere lato Server ModelState errori a mio avviso Model (MVVM KnockoutJS).

Quindi per convenzione i miei nomi di proprietà sul mio KO ViewModel corrispondono alle proprietà che la mia Api sta esponendo e aspettandosi, quindi posso mappare l'una con l'altra facilmente usando un piccolo plugin di Knockout che ho scritto.

<validation-summary params="vm: $data, class: 'alert alert-error'"></validation-summary> 

... 

<div class="control-group" data-bind="errorCss: {'error': spend }"> 
    <label class="control-label" for="spend">Spend</label> 
    <div class="controls"> 
     <div class="input-prepend"> 
      <span class="add-on">$</span> 
      <input type="text" data-bind="value: spend" id="spend" class="input-medium" placeholder="Spend USD" /> 
     </div> 
      <validation-message params="bind: spend, class: 'text-error'"></validation-message> 
     </div> 
</div> 

Il problema

problema per me è che quando JSON.Net serialises il JSON mando via e AJAX e quando incontra un'eccezione si aggiunge questo al ModelState come e Exception sul ModelError Classe.

Esempio di risposta:

{ 
    "message": "The request is invalid.", 
    "modelState": { 
    "cmd.spend": [ 
     "Error converting value \"ii\" to type 'System.Double'. Path 'spend', line 1, position 13.", 
     "'Spend' must be greater than '0'." 
    ], 
    "cmd.Title": [ 
     "'Title' should not be empty." 
    ] 
} 
} 

Il problema è che questo messaggio non è esattamente dare un grande UX:

Error converting value "ii" to type 'System.Double'. Path 'spend', line 1, position 13. 

E il fatto che io sono in grado di separare questo messaggio di eccezione dal mio messaggi di convalida poiché sono tutti in una matrice.

preferirei rimuovere questo e gestire questa materia nel mio ValidationClass

posso rimuovere manualmente in questo modo, e questo è in un ActionFilter quindi ho solo una volta.

public class ValidateCommandAttribute : ActionFilterAttribute 
    { 
     public override void OnActionExecuting(HttpActionContext actionContext) 
     { 
      ModelStateDictionary modelState = actionContext.ModelState; 

      #if !DEBUG 
       for (int i = 0; i < modelState.Values.Count; i++) 
       { 
        ModelErrorCollection errors = modelState.ElementAt(i).Value.Errors; 
        for (int i2 = 0; i2 < errors.Count; i2++) 
        { 
         ModelError error = errors.ElementAt(i2); 
         if (error.Exception != null) 
         { 
          // TODO: Add Log4Net Here 
          errors.RemoveAt(i2); 
         } 
        } 
       } 
      #endif 

      if (!modelState.IsValid) 
       actionContext.Response = actionContext.Request.CreateErrorResponse(HttpStatusCode.BadRequest, modelState); 
     } 
    } 

so JSON.Net è altamente configurabile e volevo sapere se c'è da qualche parte nelle API per esso dove posso disattivare questa funzionalità, o sopprimerla?

+1

Basta chiedersi ma si ottiene ancora quell'errore quando non si esegue il debug? –

+2

No, quando in modalità di rilascio rimuove le eccezioni. Vedo gli errori durante il debug che pensavo potesse essere utile. – SimonGates

risposta

1

È possibile impostare un error handler. Ad esempio (dai documenti di json.net),

List<string> errors = new List<string>(); 

List<DateTime> c = JsonConvert.DeserializeObject<List<DateTime>>(@"[ 
     '2009-09-09T00:00:00Z', 
     'I am not a date and will error!', 
     [ 
     1 
     ], 
     '1977-02-20T00:00:00Z', 
     null, 
     '2000-12-01T00:00:00Z' 
    ]", 
    new JsonSerializerSettings 
    { 
     Error = delegate(object sender, ErrorEventArgs args) 
     { 
      errors.Add(args.ErrorContext.Error.Message); 
      args.ErrorContext.Handled = true; 
     }, 
     Converters = { new IsoDateTimeConverter() } 
    }); 

// 2009-09-09T00:00:00Z 
// 1977-02-20T00:00:00Z 
// 2000-12-01T00:00:00Z 

// The string was not recognized as a valid DateTime. There is a unknown word starting at index 0. 
// Unexpected token parsing date. Expected String, got StartArray. 
// Cannot convert null value to System.DateTime. 
Problemi correlati