如何在传递到 C# Web API 的 Controller 操作方法的模型上创建自定义验证消息?
这是模型:
[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; }
}
这是我的 Controller 类:
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)
{
}
}
如果我将此对象发布到“发布”操作中:
{
"ID" : "1aaa","Description": "sample string 2",
}
在我的 LongValidation 的有效方法中,我得到了 long not 的默认值:“1aaa”,因此我无法在验证器中执行正确的验证。
这是长验证器的代码:
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;
}
}
}
最佳答案
1aaa
不是一个 long
值,而是一个 string
值。因此,当您将数据提交到端点时,默认模型绑定(bind)器将无法将此字符串值映射到您的 long?
属性。
如果您绝对希望将此字符串值映射到 clas 属性并进行验证,则需要将属性从 long?
更改为 string
类型。但当然现在,您需要在代码的其他部分将其转换为 long !
如果您在正常使用情况下期望数值,我建议只需使用适当的数字类型。在您的代码中,您可以检查它是否为 null
并根据需要使用它。
关于c# - 如何在传递到 Controller c# web api 的模型上创建自定义验证消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41894741/