0

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

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

1 回答 1

5

您应该能够调用ModelState.Errors.Clear特定属性。例如:

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

清除ModelState然后调用DefaultModelBinder实现..

于 2013-06-14T03:49:18.513 回答