15

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 値をハードコーディングしました。値をルックアップ テーブルの値と比較する最良の方法は何ですか? 列挙型は最善の方法ですか?

ありがとう

4

2 に答える 2

38

次のアプローチは、モデルの状態を更新し、モデルの設計と [必須] 属性などの一貫性を維持できるようにします。

私の場合、API を使用する通常レベルのユーザーが変更できない必須フィールドをモデルに持たせたいので、次のようにしました。

ModelState.Remove("ChangeDate");
ModelState.Add("ChangeDate", new ModelState());
ModelState.SetModelValue("ChangeDate", new ValueProviderResult(club.ChangeDate, DateTime.Now.ToString(), null));

そうすれば、必須フィールドを削除する必要はなく、JavaScript で日付を指定する必要もありません。

于 2012-03-14T23:45:36.107 に答える
9

明らかにこれは個人的なことですが、エラー メッセージを削除するつもりはありません。

単純な解決策を考えている場合は、[Required] 属性を削除し、コントローラに検証コードを追加して、日付が欠落している場合はエラーを追加するか、日付が正しい場合は別の値に設定します。

より複雑なソリューションを使用する場合は、モデル レベルで検証を行います。おそらく、モデルが実装する必要がある基本クラスまたはインターフェイスです。ValidationAttributes を検査し、Model で Validate メソッドを呼び出す静的な Validate(IValidate object) メソッドを持つ ValidationHelper クラス。次に、ValidationErrors のコレクションを返します。次に、モデルの検証を理解し、これらを ModelState エラーにマップするカスタム ModelBinder を記述します。

于 2009-10-23T20:48:28.383 に答える