c# - 如何在传递到 Controller c# web api 的模型上创建自定义验证消息

标签 c# asp.net-mvc validation asp.net-web-api

如何在传递到 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/

相关文章:

asp.net - <asp :PlaceHolder> alternate in mvc Razor page?

jquery - 使用 jQuery validate 验证添加到 DOM 的表单

c# - 使用 INotifyPropertyChanged 更新 ObservableCollection 项目属性

c# - 使用 NSubstitute 的自定义属性

sql - 带有 LINQ 和 SQL 数据库的 ASP.NET MVC TDD

javascript - 模糊的 JQuery 验证

javascript - 在 Laravel 中验证多个用户生成的标签

c# - BMP 中的字节到位得到 RGB

c# - 为什么内部 TransactionScope 的 IsolationLevel 不能不同,而 SQL 事务可以不同?

javascript - 如何在单击按钮时使用参数更新 DataTable?