IValidatableObjectを使用してモデルのプロパティを検証すると、フォームがポストされます。 Joeriヤンスが言うように、あなたはまだこれを防ぎ、あなたのアクションメソッドの間、ユーザーにページを返すことができます。
public ActionResult MyAction(MyModel model)
{
if (ModelState.IsValid)
{
// code to perform action when input is valid
return [return something]
}
return View(model); // re-display form because ModelState.IsValid == false
}
あなたが掲示されてからフォームを防ぐために、あなたのカスタム検証をしたい場合は、クライアント上で検証する必要があります。これを行う最も簡単な方法は、RemoteAttributeを使用する方法です。
public class MyModel
{
[Remote("MyValidateAction", "MyController", HttpMethod = "POST")]
public string MyProperty { get; set; }
}
あなたはまだIValidatableObjectであなたのコードを維持し、そのようなアクションメソッドからそれを検証することができます。
[HttpPost]
public virtual JsonResult MyValidateAction(string myProperty)
{
var model = new MyModel{ MyProperty = myProperty, };
var results = new List<ValidationResult>();
var isValid = Validator.TryValidateObject(model,
new ValidationContext(model, null, null), results, true);
return isValid
? Json(true)
: Json(results[0].ErrorMessage);
}
上記のアクションメソッドは、デフォルトのモデルバインダーとほぼ同じことを行います。あなたのビューモデルのインスタンスを構築し、それを検証します。 IValidatableObjectコードを含め、すべての検証ルールがチェックされます。あなたのviewmodelの構築のためのアクションメソッドにもっと多くのプロパティを送る必要があるならば、RemoteAttributeのAdditionalFieldsプロパティでそれを行うことができます。
これが役に立ちます。
あなたはクライアント側を意味しますか?はいの場合は、ビューに検証スクリプトを含めてください –
コードを表示できますか? –