我在MVC3中有一个分层模型。我的所有基本验证都有效,但我有一个特殊的验证,我无法弄清楚如何实现。
在我的特定树层次模型中,我有一个必须是唯一的字段/不重复其任何祖先节点中的值。就我而言,同伴不一定是唯一的。
我尝试继承ValidationAttribute
并使用validationContext.Items
来存储父节点的堆栈,但在我看来,validationContext.Items
在验证之间并不共享每个级别。如果合适,我不知道如何以正确的方式递归调用每个孩子的验证。
如果我是Validating
特定节点,我需要访问祖先节点,或者我创建传递给每个子节点的祖先节点的一些堆栈。
解决方案不应干扰其他验证器或绑定器,并且应提供字段级错误而不是根模型级错误。我还想避免ThreadStatic,
保留字符串和其他魔术技巧。是的,整个层次结构使用this technique绑定在一个视图中。
谢谢!
答案 0 :(得分:1)
你能创建一个动作过滤器吗?这使您可以访问modelstate和valueProvider,以便检查数据,然后根据需要调整Errors集合。
public class ValidateForUniqueAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
// filterContext.Controller.ViewData.Model
// modelState[key].Errors.Add( .... )
}
}
[ValidateForUnique]
public class YourController : Controller