无法在自定义验证程序中返回自定义错误消息

时间:2017-03-07 08:01:27

标签: c# asp.net-mvc asp.net-mvc-4

我为<div class="circle"></div>写了一个自定义验证,如下所示:

Guid Type

当我在浏览器上检查元素时,我有这个:

 public class ValidGuidAttribute : ValidationAttribute
{

    public override bool IsValid(object value)
    {
        string msg = "please select a device";
        ErrorMessage = msg;
        var input = Convert.ToString(value);
        if (string.IsNullOrEmpty(input) )
        {

            return false;
        }

        Guid guid;
        if(!Guid.TryParse(input,out guid))
        {
            return false;
        }
        if (guid == Guid.Empty)
        {
            return false;
        }
        return true;
    }
}

当我没有填写该档案并张贴表格时,我收到了此错误消息:

  

值&#39;请选择一个设备&#39;对设备组无效。

我想要得到这个:

  

请选择一个设备

<span class="field-validation-valid" data-valmsg-for="DeviceGroupId" data-valmsg-replace="true"></span> 我有:

ViewModel

2 个答案:

答案 0 :(得分:1)

自定义验证似乎与Guid类型存在一些问题,当我将类型更改为字符串时,您当前的实现工作正常:

enter image description here

很奇怪,因为Guid类型的有效性验证是自动执行的,因为当我删除自定义验证属性并检查有效性时,我得到了同样的错误:

enter image description here

答案 1 :(得分:1)

这是默认验证消息,我认为mvc在检查ValidGuid之前正在验证并覆盖此消息,您可以尝试

 public class ValidGuidAttribute : ValidationAttribute
    {
        public override bool IsValid(object value)
        {           
            ErrorMessage = "please select a device";
            var input = Convert.ToString(value);
            if (string.IsNullOrEmpty(input))
            {

                return false;
            }

            Guid guid;
            if (!Guid.TryParse(input, out guid))
            {
                return false;
            }
            if (guid == Guid.Empty)
            {
                return false;
            }
            return true;
        }

        public class ValidGuid : DataAnnotationsModelValidator<ValidGuidAttribute>
        {
            public ValidGuid(ModelMetadata metadata, ControllerContext context, ValidGuidAttribute attribute)
                : base(metadata, context, attribute)
            {
                if (!attribute.IsValid(context.HttpContext.Request.Form[metadata.PropertyName]))
                {

                        var propertyName = metadata.PropertyName;


                 if (context.Controller.ViewData.ModelState[propertyName] != null)
                    {
                           context.Controller.ViewData.ModelState[propertyName].Errors.Clear();
                            context.Controller.ViewData.ModelState[propertyName].Errors.Add(attribute.ErrorMessage);
                        }

                }
            }
        }
    }

并将此行添加到您的Global.asax.cs文件

DataAnnotationsModelValidatorProvider.RegisterAdapter(typeof(ValidGuidAttribute), typeof(ValidGuidAttribute.ValidGuid));