如何在C#MVC中的单个字段上禁用模型验证?

时间:2013-06-14 03:36:37

标签: c# asp.net-mvc

我有一个看起来模糊的视图模型:

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); 
    }
}

1 个答案:

答案 0 :(得分:5)

您应该可以在特定媒体资源上致电ModelState.Errors.Clear。 E.g:

if (someCondition) {
    bindingContext.ModelState["StartDate"].Errors.Clear();
    return base.BindModel(......
}

清除ModelState,然后调用DefaultModelBinder实施..