私はデータ注釈をいじっています。リンクをクリックしてページに移動すると、検証メッセージが表示されますが、データが投稿されていない限り、検証メッセージが表示されないようにしたいのですが。
見る:
@Html.TextBoxFor(m => m.EmailAddress, new { @placeholder = "Enter Email", @class = "form-control" })
@Html.ValidationSummary(true, "Registration Failed. Check your credentials")
@Html.ValidationMessageFor(m => m.EmailAddress, "You must enter a valid Email Address.")
モデル:
[Required(ErrorMessage = "Email is required")]
[DataType(DataType.EmailAddress)]
[EmailAddress]
[Display(Name = "Email Address: ")]
public string EmailAddress { get; set; }
コントローラ:
[HttpGet]
public ActionResult AddUser()
{
return View();
}
[HttpPost]
public ActionResult AddUser(UserCreateViewModel user)
{
if (ModelState.IsValid)
{
var success = UserRepository.AddUser(user);
if (success)
{
return View("Success");
}
}
return View("AddUser");
}
私が言ったように、私の問題はAddUserビューのページ読み込みで発生します。リンクをクリックしてAddUserページを表示すると、ロード後に検証メッセージが表示されますが、この時点ではデータが投稿されておらず、モデルは空です。
検証スタイルを次のように設定します。
.validation-summary-valid { display:none; }
したがって、デフォルトでは非表示になっています。エラーが発生すると表示されます。
ユーザーをバインドした後、モデルの状態をクリアできます。
ModelState.Clear();
これは、ModelBinder
がバインディングでModelState
を設定するために発生します。モデルをバインドして同じモデルのビューを返すすべてのアクションで、この問題が発生します。
[HttpPost]
public ActionResult AddUser(UserCreateViewModel user)
{
if (ModelState.IsValid)
{
var success = UserRepository.AddUser(user);
if (success)
{
return View("Success");
}
}
ModelState.Clear(); // <-------
return View("AddUser");
}
.field-validation-valid {
display: none;
}
検証がページの読み込み時にトリガーされるたびに、この「.field-validation-valid」値は、トリガーされた入力要素のクラス属性に自動的に追加されます。
その特定のクラスの値として何も表示しないようにCSSを追加すると、最初のページの読み込み時に検証メッセージが表示されなくなります。
特定の入力要素がタッチされた後も、検証メッセージは通常どおり表示されます。
これは、モデルがビューに渡されず、getとpostの両方に同じアクションが使用されたときに起こりました。
@Renan Araujoのソリューションを適用しました
$('.field-validation-error').html("");