0

ASP.NET MVC Web アプリケーションを開発しています。私のプロジェクトでは、ビュー モデル クラスへのデータ注釈を使用してリモート検証を行っています。デフォルトのリモート属性がサーバー検証をサポートしていないことは知っています。アクションメソッドで再度検証できます。しかし、それが関心の分離に違反していることはしたくありません。そこで、カスタム サーバー クライアントのリモート検証属性を作成しようとしました。オンラインでコードを見つけて使用しました。しかし、サーバーの検証が発生するとエラーが発生します。

これは私のカスタム リモート検証属性です。

public class RemoteClientServerAttribute : RemoteAttribute
    {
        protected override ValidationResult IsValid(object value, ValidationContext validationContext)
        {
            // Get the controller using reflection
            Type controller = Assembly.GetExecutingAssembly().GetTypes()
                .FirstOrDefault(type => type.Name.ToLower() == string.Format("{0}Controller",
                    this.RouteData["controller"].ToString()).ToLower());
            if (controller != null)
            {
                // Get the action method that has validation logic
                MethodInfo action = controller.GetMethods()
                    .FirstOrDefault(method => method.Name.ToLower() ==
                        this.RouteData["action"].ToString().ToLower());
                if (action != null)
                {
                    // Create an instance of the controller class
                    object instance = Activator.CreateInstance(controller);
                    // Invoke the action method that has validation logic
                    object response = action.Invoke(instance, new object[] { value });
                    if (response is JsonResult)
                    {
                        object jsonData = ((JsonResult)response).Data;
                        if (jsonData is bool)
                        {
                            return (bool)jsonData ? ValidationResult.Success :
                                new ValidationResult(this.ErrorMessage);
                        }
                    }
                }
            }

            return ValidationResult.Success;
            // If you want the validation to fail, create an instance of ValidationResult
            // return new ValidationResult(base.ErrorMessageString);
        }

        public RemoteClientServerAttribute(string routeName)
            : base(routeName)
        {
        }

        public RemoteClientServerAttribute(string action, string controller)
            : base(action, controller)
        {
        }

        public RemoteClientServerAttribute(string action, string controller,
            string areaName)
            : base(action, controller, areaName)
        {
        }
    }

これは私のモデルです:

public class CreateCategoryVM
    {
        [Required]
        [MaxLength(50)]
        [RemoteClientServer("IsNameUnique","Category",ErrorMessage="Name is already taken")]
        public string Name { get; set; }
    }

エリア名も追加してみました:

[RemoteClientServer("IsNameUnique","Category","Admin",ErrorMessage="Name is already taken")]
            public string Name { get; set; }

これは私のリモート検証アクション メソッドです。

public JsonResult IsNameUnique(string Name)
            {
                IEnumerable<Category> categories = categoryRepo.Categories.Where(x => x.Name.Trim() == Name);

            Category category = categories.FirstOrDefault();
            return Json(category==null, JsonRequestBehavior.AllowGet);
        }

しかし、コードを実行して作成すると、名前が既に使用されている場合、クライアントの検証は正しく機能しています。しかし、まだ存在しない別の名前で作成すると、サーバー側でエラーが発生します。

これらはスクリーンショットのエラーです:

ここに画像の説明を入力

ここに画像の説明を入力

そのエラーがスローされるのはなぜですか?私のコントローラーは、作成された新しい領域にあります。これはそれに対処していますか?

4

0 に答える 0