나는이 할 수있는 적어도 하나의 방법을 발견했습니다, 컨트롤러에서
[JsonConverter(typeof(SuppressModelValidationJsonConverter))]
public sealed class SuppressModelValidation<TValue>
{
private readonly TValue _value;
public SuppressModelValidation(TValue value)
{
this._value = value;
}
// this must be a method, not a property, or otherwise WebApi will validate
public TValue GetValue()
{
return this._value;
}
}
internal sealed class SuppressModelValidationJsonConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
// GetGenericArguments(Type) from http://www.codeducky.org/10-utilities-c-developers-should-know-part-two/
return objectType.GetGenericArguments(typeof(SuppressModelValidation<>)).Length > 0;
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
var valueType = objectType.GetGenericArguments(typeof(SuppressModelValidation<>)).Single();
var value = serializer.Deserialize(reader, valueType);
return value != null ? Activator.CreateInstance(objectType, value) : null;
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new NotImplementedException();
}
}
을 나는 다음과 같습니다
public Task Send([FromBody] SuppressModelValidation<MailMessage> message)
{
// do stuff with message.GetValue();
}
왜 당신은 WebApi 요청에은 MailMessage을받는 것입니까? MailMessage는 그 목적을위한 것이 아닙니다. 대신 MailMessage처럼 보이지만 완전히 제어 할 수있는 자신 만의 디자인 모델을 사용해야합니다. 일을 줄이려는 헛된 시도로 사람들이 스스로 창조 할 노동량을 놀라게하는 일은 결코 없습니다. –
@ErikFunkenbusch : 맞춤 모델 구축 방법을 고려했습니다. MailMessage는 많은 추가 작업없이 JSON과의 사이를 매우 잘 직렬화하는 전자 메일의 미리 만들어진 '모델'입니다. MailMessage를 전적으로 복제 한 내 모델을 만든 다음 MailMessage의 매퍼를 해당 모델로 작성하고 다시 작성할 수는 있지만 불필요하게 복잡해 보입니다. – ChaseMedallion
MailMessage가 이유 때문에 Serializable로 표시되지 않았으므로 일부러 고려하지 않았습니다. 이런 식으로 이러한 목적으로 설계되지 않은 클래스는 사용하지 않아야합니다. 이것은 거의 확실하게 당신을 물기 위해 되돌아 올 것이지만, 당신은 분명히 시간을 절약하기 위해 3 배 더 많은 일을 할 자유가 있습니다;) –