Razor Form Model - 强制要求的两个属性之一

时间:2013-07-11 15:21:48

标签: c# asp.net-mvc-3 razor

我知道以下是不可能的,但有没有类似的方法来实现两个属性中的一个必须填写?换句话说,用户必须输入用户名或电子邮件。

public class LogOnModel
{
    [Required(OrField=Email)]
    [Display(Name = "User name")]
    public string UserName { get; set; }

    [Required(OrField=UserName)]
    [Display(Name = "Email")]
    public string Email{ get; set; }

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

    [Display(Name = "Remember me?")]
    public bool RememberMe { get; set; }
}

1 个答案:

答案 0 :(得分:3)

您可以编写custom model validation attribute,可选择使用客户端适配器来进行javascript验证,或者您可以在控制器代码中处理此问题:

public ActionResult LogOn(LogOnModel model)
{
    if(string.IsNullOrWhitespace(model.UserName) && 
       string.IsNullOrWhitespace(model.Email)) 
    {
        ModelState.AddModelError("Username", "Either a username or email must be provided.");
    }
    if(ModelState.IsValid) {...}
    else {...}
}

在这种特殊情况下,更优雅的解决方案可能是接受Username字段中的电子邮件或用户名,并智能地检测用户提供的电子邮件或用户名。