ModelStateを更新してエラーを削除する
-
06-07-2019 - |
質問
ModelStateの更新
こんにちは、ASP.NET MVCコントローラーのModelStateについて質問があります。
ユーザーがビューから特定のオプションを選択すると、「認証」の開始日と終了日が表示されます。入力された他の日付に基づいて設定されます。
これに関する問題は、認証日がnullとして返され、CertificationMetaDataクラスがフィールドを[Required]として指定するため、アクションが読み込まれるとすぐにModelStateが無効になることです。
ModelSateエラーを手動で削除すると、これは機能しますが、これを行うより良い方法があるかどうか疑問に思っていましたか? ModelStateを更新する方法はありますか?フィールドは必須ではありませんか?または、JavaScriptを使用してビューから日付値を追加する必要がありますか?
public ActionResult Create(FormCollection fc, Certification certification, Absence absence)
{
if (certification.CertificationTypeID == 1)
{
certification.CertificationStartDate = absence.StartDate;
certification.CertificationEndDate = absence.StartDate.AddDays(7);
this.ModelState.Remove("CertificationStartDate");
this.ModelState.Remove("CertificationEndDate");
}
if (this.ModelState.IsValid)
{
// save
return RedirectToAction("Index");
}
return View();
}
また、ご覧のとおり、認証タイプのID値をハードコーディングしています。ルックアップテーブルの値と値を比較する最良の方法は何ですか?列挙型が最善の方法ですか?
ありがとう
解決
明らかにこれは個人的なものですが、エラーメッセージは削除しません。
単純な解決策を考えていた場合、[Required]属性を削除し、コントローラーに検証コードを追加して、日付が欠落している場合はエラーを追加するか、正しいタイプであれば代替値に設定します。
より複雑なソリューションを使用する場合は、モデルレベルで検証を行います。おそらく、モデルが実装しなければならない基本クラスまたはインターフェース。 ValidationAttributesを検査し、モデルのValidateメソッドを呼び出す静的なValidate(IValidate object)メソッドを持つValidationHelperクラス。その後、ValidationErrorsのコレクションを返します。次に、モデル検証を理解し、これらをModelStateエラーにマップするカスタムModelBinderを作成します。
他のヒント
次のアプローチは、モデルの状態を更新し、モデルの設計を[必須]属性などと一致させることができます。
私の場合、APIを使用する通常のレベルのユーザーが変更できない必須フィールドをモデルに追加したいので、これを実行しました。
ModelState.Remove("ChangeDate");
ModelState.Add("ChangeDate", new ModelState());
ModelState.SetModelValue("ChangeDate", new ValueProviderResult(club.ChangeDate, DateTime.Now.ToString(), null));
この方法では、必須フィールドを削除する必要はありません。また、javascriptで日付を指定する必要もありません。