我有一个看起来模糊的视图模型:
public DateTime StartDate { get; set; }
public DateTime EndDate { get; set; }
我有一个自定义 ModelBinder 来解析表单中的字段,并将值分配给它们。哪个有效。
但是,当发生错误时,我的 ModelState 最终会出现两个错误。第一个来自我的 ModelBinder,第二个来自(我猜)默认验证规则:
- 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',但选择了'search by XXX'而不是'search by date range',则表单必须成功提交且无错误)是绝对要求
代码片段:
[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);
}
}