ぼんやりと見えるビューモデルがあります:
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
サーバー側で特定のフィールドのデフォルトの検証をオフにするにはどうすればよいですか?
編集:あなたが尋ねる前に、はい、私のModelBinderはDefaultModelBinderを拡張していますが、明らかに他のデフォルトのモデルバインディング動作が必要です。カスタム動作が必要なのはこれらのフィールドだけです。
(標準の検証ルールだけを使用しないのはなぜですか?これは検索フォームであり、「カスタム日付範囲」が選択されているかどうかに応じて、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);
}
}