如何在 MVC 4 应用程序中创建替代必填字段?
How do I make an alternative required field in MVC 4 application?
我有一个 Model
,在 MVC 4
中有 phone 号码和电子邮件。这有点像注册。因此用户可以提供电子邮件或手机号码phone 或两者。但是我不能为他们做一个替代的必填字段。
我的模型就像
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; }
}
这里我想交替使用Email
和PhoneNo
。我想写一个 class 作为自定义必填字段。我已经完成了这个问题,
- Question这里的答案提供了结合javascript的解决方案。但我不会用它。我将写下 class 文件并在此处实现我的逻辑。
RequiredIf
似乎是我的问题的确切建议,但我很厌倦尝试该解决方案。我无法理解如何在我的项目中导入 .dll。它是在 Mvc 3 中开发的
- 另一个 solution,但这里他们在 class 中组合了替代属性。那么我该怎么做,因为我的属性是完全独立的。那么该怎么办。
我会选择解决方案 2 并创建一个 RequiredIf 验证属性。无需导入任何 DLL,因为您可以自己创建 class。下面是该属性的示例。它来自我在自己的代码中使用的 RequiredIfTrue 属性,我交换了验证逻辑以查找空值
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;
}
}
}
在您的 ViewModel 中,您可以像使用任何其他属性一样使用该属性,但您必须指定替代项的名称 属性
[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; }
我有一个 Model
,在 MVC 4
中有 phone 号码和电子邮件。这有点像注册。因此用户可以提供电子邮件或手机号码phone 或两者。但是我不能为他们做一个替代的必填字段。
我的模型就像
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; }
}
这里我想交替使用Email
和PhoneNo
。我想写一个 class 作为自定义必填字段。我已经完成了这个问题,
- Question这里的答案提供了结合javascript的解决方案。但我不会用它。我将写下 class 文件并在此处实现我的逻辑。
RequiredIf
似乎是我的问题的确切建议,但我很厌倦尝试该解决方案。我无法理解如何在我的项目中导入 .dll。它是在 Mvc 3 中开发的
- 另一个 solution,但这里他们在 class 中组合了替代属性。那么我该怎么做,因为我的属性是完全独立的。那么该怎么办。
我会选择解决方案 2 并创建一个 RequiredIf 验证属性。无需导入任何 DLL,因为您可以自己创建 class。下面是该属性的示例。它来自我在自己的代码中使用的 RequiredIfTrue 属性,我交换了验证逻辑以查找空值
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;
}
}
}
在您的 ViewModel 中,您可以像使用任何其他属性一样使用该属性,但您必须指定替代项的名称 属性
[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; }