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);
}
しかし、コードを実行して作成すると、名前が既に使用されている場合、クライアントの検証は正しく機能しています。しかし、まだ存在しない別の名前で作成すると、サーバー側でエラーが発生します。
これらはスクリーンショットのエラーです:
そのエラーがスローされるのはなぜですか?私のコントローラーは、作成された新しい領域にあります。これはそれに対処していますか?