質問

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で日付を指定する必要もありません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top