0

请帮助我使用 asp.net MVC 2 应用程序。

我有课:

public class Account
{
    [Required(....)]
    [RegularExpression("....")]
    public string AccountCode{ get; set; } 

    public string BankName{ get;  set; } 
}

还有一个:

public class BankPageModel
{
    public bool AccountRequired {get; set; }
    public Account NewAccount {get;set;}
}

想象一下,我的页面和表单上有 2 个文本框(AccountCode 和 BankName)和复选框(AccountRequired)。因此,当我发布表单时,如果选中了复选框,我想验证 AccountCode 是否是必需的并适合正则表达式。但如果没有选中,我只想忽略那些文本框并发布表单。但是那时不能使用Required和RegularExpression属性,它们正在阻止它。我可以制作类属性,但如果我有更多具有类似验证的文本框,我不想为每个文本框制作类属性......你怎么看?提前致谢。

4

3 回答 3

1

在服务器端执行此操作的最佳方法是让您的模型实现IValidatableObject,然后执行以下操作:

public class BankPageModel : System.ComponentModel.DataAnnotations.IValidatableObject
{
    public bool AccountRequired { get; set; }
    public Account NewAccount { get; set; }

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
        // only perform validation here if account required is checked
        if (this.AccountRequired)
        {
            // check your regex here for account
            if (!RegEx.IsMatch(this.NewAccount.AccountCode, "EXPRESSION"))
            {
                yield return new ValidationResult("Error");
            }
        }
    }
}     

以这种方式做事有助于保持控制器精简并将所有验证逻辑封装在模型中。这种方法也可以通过不显眼的 javascript来验证客户端。

于 2012-08-01T13:42:41.680 回答
1

您不需要使用 DataAnnotations 来执行验证,它们只是使常见验证场景的事情变得更容易(并且您也可以免费获得客户端 JavaScript 验证)。

您始终可以在 Controller 操作中使用 C# 代码执行验证,如下所示:

public ViewResult BankPageAdd(BankPageModel model)
{
    if(model.AccountRequired &&
        (String.IsNullOrWhiteSpace(model.Account.AccountCode) || !Regex.IsMatch(model.Account.AccountCode, "PATTERN HERE"))
        ModelState.AddModelError("NewAccount.AccountCode", "ERROR MESSAGE HERE");

    //remainder of your controller action code here
}
于 2012-07-31T22:21:34.933 回答
0

和 javaScript 版本:

function validateAccountCode() {
        var bCkd = document.getElementById("ckbxAccountRequired").checked;

        if (bCkd) {
           var accountCode = document.forms[0].elements["AccountCode"].value;
            if(!accountCode.match(yourRegEx) || accountCode==""){
               alert('Please fill in the Account Code');
               return false;
            }
            return true;
        }
        return true;
    }
于 2012-08-01T13:35:32.243 回答