我有一个看起来模糊的视图模型:
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'表示开始日期,但选择'按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);
}
}
答案 0 :(得分:5)
您应该可以在特定媒体资源上致电ModelState.Errors.Clear
。 E.g:
if (someCondition) {
bindingContext.ModelState["StartDate"].Errors.Clear();
return base.BindModel(......
}
清除ModelState
,然后调用DefaultModelBinder
实施..