具有层次结构意识的MVC3自定义验证

时间:2011-11-21 17:55:44

标签: asp.net-mvc-3 validation hierarchy model-binding

我在MVC3中有一个分层模型。我的所有基本验证都有效,但我有一个特殊的验证,我无法弄清楚如何实现。

在我的特定树层次模型中,我有一个必须是唯一的字段/不重复其任何祖先节点中的值。就我而言,同伴不一定是唯一的。

我尝试继承ValidationAttribute并使用validationContext.Items来存储父节点的堆栈,但在我看来,validationContext.Items在验证之间并不共享每个级别。如果合适,我不知道如何以正确的方式递归调用每个孩子的验证。

如果我是Validating特定节点,我需要访问祖先节点,或者我创建传递给每个子节点的祖先节点的一些堆栈。

解决方案不应干扰其他验证器或绑定器,并且应提供字段级错误而不是根模型级错误。我还想避免ThreadStatic,保留字符串和其他魔术技巧。是的,整个层次结构使用this technique绑定在一个视图中。

谢谢!

1 个答案:

答案 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