0

asp.netMVC2アプリケーションを手伝ってください。

授業がある:

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

    public string BankName{ get;  set; } 
}

そしてもう1つ:

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

2つのテキストボックス(AccountCodeとBankName)とチェックボックス(AccountRequired)を含むページとフォームがあるとします。したがって、フォームを投稿するときに、チェックボックスがオンになっている場合は、AccountCodeが必須であり、正規表現に適合することを検証します。ただし、チェックされていない場合は、これらのテキストボックスを無視して、フォームを投稿します。ただし、Required属性とRegularExpression属性は使用できず、それを妨げています。クラス属性を作成することはできますが、同様の検証を行うテキストボックスがさらにある場合、それぞれにクラス属性を作成したくないと思います...どう思いますか?前もって感謝します。

4

3 に答える 3

1

検証を実行するためにDataAnnotationsを使用する必要はありません。DataAnnotationsを使用すると、一般的な検証シナリオが簡単になります(また、クライアント側のJavaScript検証も無料で入手できます)。

以下のように、コントローラーアクションの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 に答える
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 に答える
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 に答える