Wie erstelle ich eine benutzerdefinierte Validierungsnachricht für ein Modell, das an eine Controller-Aktionsmethode einer C# -Web-API übergeben wird? HierWie erstelle ich eine benutzerdefinierte Validierungsnachricht für ein an einen Controller übergebenes Modell C# web api
ist das Modell:
[DataContract]
public class TestDto //: IValidatableObject
{
[DataMember]
[LongValidation("Its not a long!")]
public long? ID { get; set; }
[DataMember]
public string Description { get; set; }
public string DescriptionHidden { get; set; }
}
Hier ist meine Controller-Klasse:
public class ValuesController : ApiController
{
// GET api/values
public IEnumerable<string> Get()
{
return new string[] { "value1", "value2" };
}
// GET api/values/5
public string Get(int id)
{
return "value";
}
// POST api/values
public string Post([FromBody]TestDto testDto)
{
//todo: should a post return any data?
if (ModelState.IsValid)
return "success!";
else
{
var ret = string.Empty;
foreach (var modelState in ModelState)
{
ModelErrorCollection errorCollection = modelState.Value.Errors;
var errors = string.Empty;
foreach (var error in errorCollection)
{
errors = errors + "exception message: " + error.Exception.Message + ", errorMessage: " + error.ErrorMessage;
}
ret = ret + "Error: " + modelState.Key + ", " + modelState.Value.Value + ", errors: " + errors;
}
return ret;
}
}
// PUT api/values/5
public void Put(int id, [FromBody]string value)
{
}
// DELETE api/values/5
public void Delete(int id)
{
}
}
Wenn ich dieses Objekt in den Beitrag Aktion schreiben:
{
"ID" : "1aaa","Description": "sample string 2",
}
In meinem LongValidation gültigen Methode, ich bekomme den Standardwert für eine lange nicht: "1aaa", so kann ich die korrekte Validierung in der Valida nicht durchführen Tor. Hier
ist der Code für die Lang Validator:
public class LongValidationAttribute : ValidationAttribute
{
public LongValidationAttribute(string errorMessage) : base(errorMessage)
{
}
public override string FormatErrorMessage(string name)
{
return base.FormatErrorMessage(name);
}
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
long ret;
bool success = long.TryParse(value.ToString(), out ret);
//return base.IsValid(value, validationContext);
if (success == false)
return new ValidationResult(this.ErrorMessage);
else
{
return ValidationResult.Success;
}
}
}
Danke für die Darstellung der richtigen Art und Weise, die Dinge im gegebenen Kontext zu tun. Das angegebene Code-Snippet funktioniert für den asp.net-Core. Ich habe den Code in meiner Antwort unten umgestaltet, um Leuten zu helfen, die gleiche Funktionalität in mvc4 + zu erreichen. Danke noch einmal. – xDisruptor