2016-07-27 11 views
2

Ich erstelle einen benutzerdefinierten JsonConverter, der in einem Attribut einer Modellklasse verwendet werden soll. Das Modell wird als Eingabeparameter in einem Web-API-Controller verwendet. In meinem JsonConverter werfe ich einen FormatException wenn ich die Eingabe nicht mag.Wie wird eine Ausnahme abgefangen, die in einem JsonConverter-Attribut ausgelöst wird?

Hier ist ein Teil meines Modells ist:

public class PropertyVM 
{ 
    public string PropertyId { get; set; } 

    [JsonConverter(typeof(BoolConverter))] 
    public bool IsIncludedInSearch { get; set; } 
} 

Und hier ist mein Controller-Aktion:

[HttpPost, Route("{propertyId}")] 
public IHttpActionResult UpdateProperty(string propertyId, [FromBody] PropertyVM property) 
{ 
    bool success; 
    try 
    { 
     property.PropertyId = propertyId; 
     success = _inventoryDAL.UpdateProperty(property); 
    } 
    catch (Exception ex) when 
    ( 
      ex is ArgumentException 
     || ex is ArgumentNullException 
     || ex is ArgumentOutOfRangeException 
     || ex is FormatException 
     || ex is NullReferenceException 
     || ex is OverflowException 
    ) 
    { 
     return BadRequest(ex.Message); 
    } 

    if (!success) 
    { 
     return NotFound(); 
    } 

    return Ok(); 
} 

Wenn ich den Controller mit einem schlechten Wert für IsIncludedInSearch nennen, erwartete ich meine die FormatException in fangen Controller, aber das passiert nicht. Die Ausnahme wird in meinem Konverter ausgelöst, aber das passiert, wenn der Medienformatierer ausgeführt wird. Als ich in meinen Controller komme, wurde die Ausnahme ausgelöst, aber ich kann sie nicht verstehen. Also gebe ich OK zurück, obwohl ich einen schlechten param habe.

Wie bekomme ich meinen Controller zu sehen, dass der Konverter eine Ausnahme ausgelöst hat, so dass ich die entsprechende Antwort zurückgeben kann?

Antwort

1

Sie müssen die Modellstatusfehler überprüfen, die die Validierungsfehler und andere Attributfehler des Modells enthalten. So können Sie etwas in Ihrem Code tun:

[HttpPost, Route("{propertyId}")] 
    public IHttpActionResult UpdateProperty(string propertyId, 
     [FromBody] PropertyVM property) 
    { 
     bool success = false; 
     if (ModelState.IsValid) 
     { 
      try 
      { 
       property.PropertyId = propertyId; 
       success = _inventoryDAL.UpdateProperty(property); 
      } 
      catch (Exception ex) //business exception errors 
      { 
       return BadRequest(ex.Message); 
      } 

     } 
     else 
     { 
      var errors = ModelState.Select(x => x.Value.Errors) 
            .Where(y => y.Count > 0) 
            .ToList(); 
      return ResponseMessage(
       Request.CreateResponse(HttpStatusCode.BadRequest, errors)); 
     } 

     if (!success) 
     { 
      return NotFound(); 
     } 

     return Ok(); 
    } 
+0

Perfekt, danke! – Val