3

次のようなカスタム ValidationAttribute があります。


public class ReceiverRegion : ValidationAttribute
    {
        private RegionService regionService;
        private CityService cityService;

        public ReceiverRegion() : base("Incorrect region code")
        {
            this.regionService = new RegionService();
            this.cityService = new CityService();
        }

        protected override ValidationResult IsValid(object value, ValidationContext validationContext)
        {
            int regionId = Convert.ToInt32(value);
            int plate = Convert.ToInt32((validationContext.ObjectInstance as CorporateOrderItem).ReceiverCity);

            int productGroupId = Convert.ToInt32(validationContext.Items["productGroup"].ToString());

            if (!CheckReceiverRegionExistence(regionId, plate, productGroupId))
            {
                IEnumerable regions = this.regionService.GetList(cityService.GetByPlate(plate).PKCityId);

                return new CorporateOrderValidationResult(base.ErrorMessage, regions.Select(r=>r.Name));
            }
            return CorporateOrderValidationResult.Success;
        }

        private bool CheckReceiverRegionExistence(int plate, int regionId, int productGroup)
        {
            return !(regionService.GetByCityAndRegionIdForProductGroup(plate, regionId, productGroup) == null);
        }
    }

しかし、IsValid メソッドでわかるように、ValidationResult を継承するカスタム オブジェクトを返そうとしています。私の問題は、CorporateOrderValidationResultIsValid がベース ValidationResult タイプを返すため、インスタンスの余分なメンバーにアクセスできないことです。以下は、validate を呼び出して ValidationResult のコレクションを戻り値として取得するコードです。


List results = new List();
bool isValid = Validator.TryValidateObject(instance, context, results, true);

結果オブジェクトを にキャストしようとしましたList<CorporateOrderValidationResult>が、何を試しても (たとえば -->item as CorporateOrderValidationResultまたはInvalidCastExceptionresults.OfType<CorporateOrderValidationResult>()または(CorporateOrderValidationResult)item)null 値を取得します。この結果のリストをカスタム結果クラスのリストに変換する方法はありますか?ありがとう...

4

2 に答える 2

0

これは古い質問ですが、カスタムValidationResultクラスを要求すると、最初に Google が表示されます。Vyacheslav Volkovが提示した例は機能しますが、なぜですか?

今日、コードを機能させるために数時間を費やしました-重要な行は次のとおりです。

public TestResult(): base ("test")

エラーメッセージをまったく使用するつもりはありませんでした。これには独自の構造があったため、ctor を次のように記述しました。

public TestResult() : base("")- 基本クラスに送信された空の文字列には、ドキュメントに記載されていない結果があります。メソッドは、バージョンの によって返されるオブジェクトをコレクションにTryValidate()挿入しませんが、このフィールドのデフォルトのエラー メッセージを使用して新しいオブジェクトを作成し、必要なオブジェクトの代わりに配置します。resultsIsValid()"Field " + fieldName + " is Invalid"

于 2016-06-03T09:12:22.817 に答える