2013-07-25 3 views
0

Я использую настраиваемый формат Media, чтобы читать данные post для multipartform в webapi. Обработка ошибок сериализации и ошибок проверки в пользовательском атрибуте Action Filter. В форматировании я сопоставляю ввод с типом Object ImageMedia. Я хочу добавить любые ошибки serliazation в ModelState, чтобы я мог обрабатывать те в CustomFilterAttribute, которые получают ActionContext. Вот код:Как добавить ошибки в Modelstate в Custom mediaFormatter

public class ImageMediaFormatter : MediaTypeFormatter 
{ 
    public ImageMediaFormatter() 
    { 
     SupportedMediaTypes.Add(new MediaTypeHeaderValue("image/jpeg")); 
     SupportedMediaTypes.Add(new MediaTypeHeaderValue("image/jpg")); 
     SupportedMediaTypes.Add(new MediaTypeHeaderValue("image/png")); 
     SupportedMediaTypes.Add(new MediaTypeHeaderValue("image/gif")); 
     SupportedMediaTypes.Add(new MediaTypeHeaderValue("multipart/form-data")); 
    } 

    public override bool CanReadType(Type type) 
    { 
     return type == typeof(ImageMedia); 
    } 

    public override bool CanWriteType(Type type) 
    { 
     return false; 
    } 

    public override Task<object> ReadFromStreamAsync(
     Type type, Stream stream, HttpContent request, 
     IFormatterLogger formatterContext) 
    { 
     return Task.Factory.StartNew<object>(() => 
     { 
      var streamProvider = new MultipartMemoryStreamProvider(); 
      var keys = new Dictionary<string, string>(); 

      var result = request.ReadAsMultipartAsync(streamProvider).Result; 

      //get and remove random slashes from posted vaues 
      var categoryid = 
      streamProvider.Contents.First(x => x.Headers.ContentDisposition.Name.Contains("userGeneratedCategoryId")).ReadAsStringAsync().Result.Replace("\"", string.Empty); 
      keys.Add(Constants.UserGeneratedCategoryId, categoryid); 

      var imageBuffer = 
       streamProvider.Contents.First(x => x.Headers.ContentDisposition.Name.Contains(Constants.ImageFile)).ReadAsByteArrayAsync().Result; 

      return new ImageMedia(keys, imageBuffer); 
     }); 
    }   
}   



public class ImageMedia 
{ 
    public ImageMedia(Dictionary<string, string> keys, byte[] imageBuffer) 
     : this() 
    { 
     var keyvaluePair = new KeyValuePair<string, string>(); 
     foreach (var property in GetType().GetProperties()) 
     { 
      try 
      { 
       keyvaluePair = keys.FirstOrDefault(pair => pair.Key.ToLower() == property.Name.ToLower()); 
       if (!string.IsNullOrEmpty(keyvaluePair.Key)) 
       { 
        property.SetValue(this, keyValuePair.Value, null); 
       } 
      } 
      catch (Exception ex) 
      { 
       // Add these serialization errors to the Model State so I can handle these in a Custom Validation Action Attribute 

       Errors.Add(keyvaluePair.Key, new List<string> { ex.Message });      
       IsValid = false;      
      } 
     } 
     Buffer = imageBuffer; 
    } 

    private ImageMedia() 
    { 
     Errors = new Dictionary<string, List<string>>();   
    } 

    public int UserGeneratedCategoryId { get; set; } 
    public byte[] Buffer { get;set;} 
} 

ответ

1

Вы могли бы добавили ошибки в поставляемых IFormatterLogger контекст, который передается и ReadFromStreamAsync методы:

public override Task<object> ReadFromStreamAsync(Type type, Stream stream, HttpContent request, 
    IFormatterLogger formatterContext) 

Пример:

formatterLogger.LogError(errorPath: "OrderedDate", errorMessage: "Not a valid date"); 
Смежные вопросы