基本上,有一个具有两个属性的模型:
public int CatID {get; set;}
[Required]
public string CatName {get; set;}
使用@Html.DropDownFor
和TextBoxFor
进行渲染时,将应用不干扰验证,因此需要CatName
。
CatName
仅在设置了CatID
时可见,否则文本框的某些容器被设置为display: none
。非侵入式验证不会在隐藏的项目上运行,因此,如果未设置CatName
(因为它不可见)而允许发布该表单,则可以很好地工作。
但是在MVC代码中,如果不考虑CatName
而未设置CatID
,则modelstate无效。
我需要的是一种以最好的方式在服务器和客户端上应用条件验证的方法。
我可以通过实现自己的自定义代码来检查字段,从而使模型实现IValidatableObject
来处理服务器端,但是我必须删除[Required]
属性,以防止进行无干扰的验证工作。
理想情况下,我想要一个优雅的解决方案,该方案允许客户端和服务器端验证,同时仍然能够在我的控制器中使用ModelState.IsValid
,这不是超级hacky,但是我没有主意。理想情况下,我希望它由模型属性或模型驱动,因此验证是自包含的,这意味着UI不必在其中包含任何模型特定的代码-如果以后再更改模型以表明它不需要例如,我不想更新我的UI。