0

答えをグーグルで検索したところ、トピックに多くの質問とブログ投稿が見つかりました。多くは非常に複雑な方法のようであり、いくつかは不完全です。

タイプが2つのプロパティを持つCustomerオブジェクトがありますAddress。1つはBillingAddressで、もう1つはShippingAddressです。フォームでは、アドレスタイプにEditorTemplateを使用しています。ユーザーは、ShippingAddressがBillingAddressと同じかどうかを選択するオプションがあります。

public class Customer
{
    public virtual string CustomerName { get; set; }
    public virtual string Title { get; set; }
    public virtual Address BillingAddress { get; set; }
    public virtual Address ShippingAddress { get; set; }
    public virtual bool ShippingSameAsBilling { get; set; }
    // Cont..
}

public class Address
{
    public virtual string AddressLine { get; set; }
    [Required]
    public virtual string City { get; set; }
    // Cont..
}

注:ビューにチェックボックスがありますpublic virtual bool ShippingSameAsBilling { get; set; }

私の問題は、Address必須フィールドを持つクラスのタイプであるAddressプロパティの検証が必要なことです。ユーザーが「配送先住所は請求先住所と同じ」を選択しない場合は、すべて正常に機能します。彼/彼女がそれらを同じにして記入のみにすることを選択した場合BillingAddressShippingAddressEditorTemplateは必須フィールドにエラーを表示します。

アドレスクラスから属性を削除[Required]し、フォームが投稿された後、サーバー側で手動で検証できます。私にとっては、このシナリオでうまく機能します。また、クライアント側の検証を既存のMVC検証に手動でバインドする方法を知る必要がありますか?または、この目標を達成するためのより良い方法を提案してください。

4

1 に答える 1

0

fluentValidationをパッケージとしてNUGETでも試してみることをお勧めします。

あなたはあなたの検証をはるかにコントロールしていて、私の意見では、属性を使用するよりもクリーンな方法です。短い例:

[Validator(typeof(CustomerValidator))]
public class Customer{
    public virtual string CustomerName { get; set; }
    public virtual string Title { get; set; }
    public virtual Address BillingAddress { get; set; }
    public virtual Address ShippingAddress { get; set; }
    public virtual bool ShippingSameAsBilling { get; set; }
    // Cont..
}

public class CustomerValidator : AbstractValidator<Customer> {
    public CustomerValidator() {        
        RuleFor(x => x.CustomerName ).Length(0, 10);
        RuleFor(x => x.Email).EmailAddress();
        RuleFor(x => x.ShippingAddress).NotEmpty()
                .When(customer => !customer.ShippingSameAsBilling );
    }
}


(Addressクラスのバリデーターも指定し、属性を追加する必要があることに 注意してください)

NotEmpty()が正しいかどうかわからないため、配送先住所の検証を無効にする方法については、ドキュメントを参照してください。.Must()またはSetValidator()を確認することをお勧めします。

そして最後にFluentValidationModelValidatorProvider.Configure();をapplication_startに追加します

于 2013-01-09T10:09:30.743 に答える