0

私は自分のページのための控えめなクライアント側の検証セットアップがあります。エラーメッセージはデータベースから返されます。私がパラメータを追加するために必要とした検証メッセージの1つでは、私はそれを特定の値でフォーマットすることができます。これは良いサーバー側で動作しますが、私は明らかにGetClientValidationRulesメソッドが最初にセットアップされたときに、これらの値のいくつかにアクセスできませんでした。このため、クライアント側のコードにエラーメッセージを作成する必要があるようですが、jQuery.validator.addMethodでtrueまたはfalseを返すだけで、これを行う方法はわかりません。MVC3とカスタムクライアント側の検証メッセージ

私は基本的にErrorMessageをGetClientValidationRulesメソッドのstring.Emptyに設定してから、自分のクリケット側のコードで検証を行い、必要なメッセージを返すことができるようにします。ここで

public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context) 
    { 
     var rule = new ModelClientValidationRule 
         { 
          ValidationType = "maximumdatecoverrequired", 
          ErrorMessage = string.Empty, 
         }; 

     rule.ValidationParameters.Add("maxdate", DateTime.Now.AddDays(Settings.Default.MaximumDateCoverRequiredDaysInFuture).ToString("yyyy/MM/dd")); 

     return new[] { rule }; 
    } 

ここでは、この特定のプロパティに対して検証するために、私のクライアント側のコードがある

MVC 3にまで配線されているクライアント側のコードです。

jQuery.validator.addMethod("maximumdatecoverrequired", function (value, element, params) { 
     var maxDate = new Date(params["maxdate"]); 
     var day = maxDate.getDate(); 
     var month = maxDate.getMonth() + 1; 
     var year = maxDate.getFullYear(); 

     var dateCoverRequired = new Date(value).toString('yyyy/MM/dd'); 
     maxDate = maxDate.toString('yyyy/MM/dd'); 

     if (value > maxDate) { 
      $("input#DateCoverRequired_Day").val(day); 
      $("select#DateCoverRequired_Month").val(month); 
      $("input#DateCoverRequired_Year").val(year); 
      return false; 
     } 

     return true; 
    }); 

クライアント側のコードでカスタムメッセージを返すにはどうすればよいですか?

+1

あなたは何を検証しようとしていますか?あまりにも多くの詳細がありません – gdoron

+0

gdoron - 私は達成しようとしているもので私の質問を更新しました。 – doogdeb

+0

@doogdeb、もう一度更新してください。今回はコードを含めることを忘れないでください。 –

答えて

1

これを行う方法の例を挙げておきます。私が選択する例は、新しいユーザーを登録し、その名前を確認することです。

ユーザーがUserNameを選択できるようにすることです。既にデータベースに存在する場合は、その名前を持つことを許可せず、提案を行います。

これを行うには、コントローラのActionMethodを指すリモート検証を使用します。

登録モデル

public class RegisterModel 
    { 
     //This is the one I'm giving you the code for... 
     [Required] 
     [RegularExpression(@"(\S)+", ErrorMessage = "Username cannot contain spaces.")] 
     [Remote("CheckUserName", HttpMethod="POST")] 
     [Display(Name = "Username")] 
     public string UserName { get; set; } 

     // You can do this one yourself :-) 
     [Required] 
     [Remote("CheckEmailAddress", ErrorMessage="{0} already has an account, please enter a different email address.", HttpMethod="POST")] 
     [DataAnnotationsExtensions.Email(ErrorMessage="{0} is not a valid email address.")] 
     [Display(Name = "Email address")] 
     public string Email { get; set; } 

     [Required] 
     [ValidatePasswordLength] 
     [DataType(DataType.Password)] 
     [Display(Name = "Password")] 
     public string Password { get; set; } 

     [DataType(DataType.Password)] 
     [Display(Name = "Confirm password")] 
     [Compare("Password", ErrorMessage = "The password and confirmation password do not match.")] 
     public string ConfirmPassword { get; set; } 
    } 

ActionMethod(モデルによって参照されるリモートメソッド)

[HttpPost] 
[OutputCache(Location = OutputCacheLocation.None, NoStore = true)] 
public JsonResult CheckUserName(string userName, Guid? userId = null) 
{ 
    if (userName != null || userName.Length > 2) 
    { 
     var users = Membership.FindUsersByName(userName); 
     if (users.Count == 0) 
     { 
       return Json(true); 
     } 
     else 
     { 
      if ((users[userName].ProviderUserKey as Guid?) == userId) 
      { 
       return Json(true); 
      } 
      else 
      { 
       string suggestedUID = String.Format(CultureInfo.InvariantCulture, "{0} is not available.", userName); 
       // Maybe this is a bit feeble, but it will loop around (inefficiently) and suggest a new username with a number on the end. EG Tom is not available. Try Tom37 
       for (int i = 1; i < 100; i++) 
       { 
        string altCandidate = userName + i.ToString(); 
        if (Membership.FindUsersByName(altCandidate).Count == 0) 
        { 
         suggestedUID = String.Format(CultureInfo.InvariantCulture, "{0} is not available. Try {1}.", userName, altCandidate); 
         break; 
        } 
       } 
       // This is the important bit. I am returning a suggested UserName 
       return Json(suggestedUID, JsonRequestBehavior.AllowGet); 
      } 
     } 
    } 
    else 
    { 
     return Json(true); 
    } 
} 

私は正規表現はありませんがありますを確認しますので、これは、かなりクールだと思います(それが大丈夫ならば)データベースをチェックするリモートメソッドに送信されます。