2017-03-07 42 views
2

我已經寫了一個自定義驗證爲Guid Type像這樣:不能返回Custome錯誤消息Custome驗證

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; 
    } 
} 

,當我在瀏覽器上檢查元素我有這樣的:

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

當我沒有填寫該表格和帖子時,我得到了這個錯誤信息:

'請選擇一個設備'的值不是對設備組有效。

我只想得到這個:

請選擇一個設備

,並在ViewModel我:

 [DisplayName("device group"),ValidGuid(ErrorMessage = "please enter")] 
    public Guid DeviceGroupId { get; set; } 

回答

1

看來,自定義的驗證有一些問題,類型Guid,當我將類型更改爲字符串時,您當前的實現工作:

enter image description here

是自動進行的,因爲當我刪除自定義驗證attibute和檢查的有效性,我得到了同樣的錯誤,你得到這很奇怪,在確認爲Guid類型的有效性:

enter image description here

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));