0

ぼんやりと見えるビューモデルがあります:

public DateTime StartDate { get; set; }
public DateTime EndDate { get; set; }

フォーム内のフィールドを解析し、値を割り当てるカスタム ModelBinder があります。これは機能します。

ただし、エラーが発生すると、ModelState に 2 つのエラーが発生します。私のModelBinderからの1つ目と、デフォルトの検証ルールからの2つ目:

- Invalid start date selected                    <-- My custom error message.
- The value 'fgfdg' is not valid for Start Date. <-- I want this to go away

サーバー側で特定のフィールドのデフォルトの検証をオフにするにはどうすればよいですか?

編集:あなたが尋ねる前に、はい、私のModelBinderDefaultModelBinderを拡張していますが、明らかに他のデフォルトのモデルバインディング動作が必要です。カスタム動作が必要なのはこれらのフィールドだけです。

(標準の検証ルールだけを使用しないのはなぜですか?これは検索フォームであり、「カスタム日付範囲」が選択されているかどうかに応じて、StartDate と EndDate を無視するか、解析してさまざまなチェックを実行します。具体的には、日付範囲が無効な場合 (たとえば、開始日に「fdafsfsf」を使用し、「日付範囲で検索」ではなく「XXX で検索」が選択されている場合、フォームはエラーなしで正常に送信される必要があります) は絶対的な要件です。

コードフラグメント:

[ModelBinderType(typeof(MyViewModel))]
public class MyViewModelBinder : DefaultModelBinder {
    public override object BindModel(ControllerContext cc, ModelBindingContext bc) {
        var model = new MyViewModel();
        var searchType = cc.HttpContext.Request["SearchType"];
        if (searchType == "CustomDateRange") {
          // Do checks here, etc.
          // ONLY if searchType == "CustomDateRange" should there be ANY validation on StartDate
          bc.ModelState.AddModelError("StartDate", "Invalid start date; outside of invoice range");
        }
        // bc.ModelState["StartDate"].Errors.Clear(); <--- Clears my error, not the default one.
        bc.ModelMetadata.Model = model;
        return base.BindModel(cc, bc); 
    }
}
4

1 に答える 1