2

MVC 4に電話番号とメールアドレスの両方を持つModelがあります。それは登録のようなものです。したがって、ユーザーは電子メールまたは携帯電話番号、またはその両方を提供できます。しかし、私はそれらの代替フィールドを作ることはできません。私のモデルは、ここでMVC 4アプリケーションで代替フィールドを作成するにはどうすればよいですか?

public class RegisterModel 
    { 
     [Required] 
     [Display(Name = "User name")]   
     [UsernameValidator(ErrorMessage = "Only Letters and numbers")] 
     [System.Web.Mvc.Remote("IsUserExitst", "Account", HttpMethod = "POST", ErrorMessage = "This user name already exists. Try a new one.")] 
     public string UserName { get; set; } 

     [Required] 
     [StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 6)] 
     [DataType(DataType.Password)] 
     [Display(Name = "Password")] 
     public string Password { get; set; } 

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

     [Required] 
     [MaxLength(50)] 
     [EmailOrPhoneValidator(ErrorMessage = "Invalid Phone number")] 
     [Display(Name = "Phone number")] 
     [System.Web.Mvc.Remote("IsMobOrEmailExists", "Account", HttpMethod = "POST", ErrorMessage = "This Phone number or Email already exists. Try a new one.")] 
     public string MobileNo { get; set; } 


     [Required] 
     [MaxLength(50)] 
     [EmailAddress(ErrorMessage = "Invalid Email address")] 
     [Display(Name = "Email")] 
     [System.Web.Mvc.Remote("IsEmailExists", "Account", HttpMethod = "POST", ErrorMessage = "This Email already exists. Try a new one.")] 
     public string Email { get; set; } 
    } 

のようなものです 私は、代わりにEmailPhoneNoを使用します。カスタム必須フィールドとして動作するクラスを作成したいと思います。私はこの質問を見てきました。

  1. Question答えはjavascriptと組み合わせたものです。しかし、私はそれを使用しません。私はクラスファイルを書き留め、私のロジックを実装します。
  2. RequiredIfは私の質問の正確な提案と思われますが、私はその解決策を試して疲れました。私は自分のプロジェクトで.dllをインポートする方法を理解できません。それはMvc 3で開発されました。
  3. もう1つはsolutionですが、ここではクラス内の代替プロパティを組み合わせています。だから私のプロパティが完全に別々であるように私はどのように行うのですか?じゃあ何をすればいいの。
+1

最初のリンクには何が問題なのですか。 'Email'が提供されない場合、' MobileNo'が提供され、 'MobileNo'が提供されない場合、' Email'が提供されることが必要です。私は2番目のオプションで、[foolproof](http://foolproof.codeplex.com/)属性を参照すると仮定します。 (これには '[RequiredIfNot]'があります) –

+0

他の必要なエラーと同様にエラーメッセージを表示することができないので、 'javascript'は好きではありません。 Javascriptはそれ自身の方法でエラーを表示しています。 – gdmanandamohon

+1

もちろん可能です。これは、クライアント側の検証が 'jquery.validate.js'と' jquery.validate.unobtrusive.js'を使ってどのように動作するのかです。 –

答えて

1

私は解決策2に行き、RequiredIf検証属性を作成します。 DLLをインポートする必要はありません。自分でクラスを作成するだけで済みます。次に、属性の外観の例を示します。それは私が自分自身のコードで使用RequiredIfTrue属性からだと私はあなたが他の属性のような属性を使用することができ、あなたのViewModelには空の値

public class RequiredIfEmpty : ValidationAttribute 
{ 
    private string _fieldName; 

    public RequiredIfEmpty(string fieldName) 
    { 
     _fieldName = fieldName; 
    } 

    protected override ValidationResult IsValid(object value, ValidationContext validationContext) 
    { 
     var property = validationContext.ObjectType.GetProperty(_fieldName); 
     if (property == null) 
     { 
      throw new ArgumentException("No property with the name " + _fieldName + " found."); 
     } 

     string fieldValue = (string)property.GetValue(validationContext.ObjectInstance, null); 
     if (String.IsNullOrWhiteSpace(fieldValue)) 
     { 
      return (value != null && !String.IsNullOrWhiteSpace((string)value) ? ValidationResult.Success : new ValidationResult(ErrorMessage)); 
     } 
     else 
     { 
      return ValidationResult.Success; 
     } 
    } 
} 

を探すために検証ロジックを交換していますがの名前を指定する必要があります代替プロパティ

[RequiredIfEmpty("Email", ErrorMessage = "Phone number invalid")] 
[MaxLength(50)] 
[Display(Name = "Phone number")] 
[System.Web.Mvc.Remote("IsMobOrEmailExists", "Account", HttpMethod = "POST", ErrorMessage = "This Phone number or Email already exists. Try a new one.")] 
public string MobileNo { get; set; } 
+0

あなたのコード部分はかなり大丈夫です。しかし、検証要約の両方のエンティティの上に 'RequiredIfEmpty'を書き込むと、メッセージは2回表示されます。一方、上記のいずれかを書くと、両方の入力ボックスをハイライト表示するのではなく、単一の入力フィールドのみをマーキングするのではありません。 – gdmanandamohon

+2

これでクライアント側の検証は行われません。 –

+0

はい!正確に@Stephen Muecke、フォームの送信後、検証エラーが返ってきます。 – gdmanandamohon

関連する問題