Asp.net mvc 3 具有层次结构感知的MVC3自定义验证

Asp.net mvc 3 具有层次结构感知的MVC3自定义验证,asp.net-mvc-3,validation,hierarchy,model-binding,Asp.net Mvc 3,Validation,Hierarchy,Model Binding,我在MVC3中有一个层次模型。我所有的基本验证都在工作,但我有一个特殊的验证,我不知道如何实现 在我的特定树层次结构模型中,我有一个字段,该字段必须是唯一的/不重复其任何祖先节点中的值。就我而言,同龄人不一定非得是独一无二的 我尝试继承ValidationAttribute并使用validationContext.Items存储父节点堆栈,但在我看来,validationContext.Items在每个级别的验证之间是共享的。如果合适的话,我不知道如何对每个孩子正确地递归调用验证 如果我在验证一

我在MVC3中有一个层次模型。我所有的基本验证都在工作,但我有一个特殊的验证,我不知道如何实现

在我的特定树层次结构模型中,我有一个字段,该字段必须是唯一的/不重复其任何祖先节点中的值。就我而言,同龄人不一定非得是独一无二的

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

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

解决方案不应该干扰其他验证器或绑定器,应该提供字段级错误,而不是根模型级错误。我还想避免
ThreadStatic、
保留字符串和其他魔术。是的,使用将整个层次绑定到单个视图中


谢谢

你能创建一个动作过滤器吗?这使您可以访问modelstate和valueProvider,以便检查数据,然后根据需要调整错误集合

public class ValidateForUniqueAttribute : ActionFilterAttribute
{
  public override void OnActionExecuting(ActionExecutingContext filterContext)
  {
     // filterContext.Controller.ViewData.Model

       //  modelState[key].Errors.Add( .... )
  }

}


[ValidateForUnique]
public class YourController : Controller

谢谢你的回复。我想我不完全明白。ActionFilterAttribute如何比Validation属性更适合这种情况?我假设这使我能够访问操作的完整模型,但是我不能访问每个节点(如果我自己没有实现模型绑定部分来将成员转换为正确的modelState集合的密钥,那么我就不能访问每个节点。模型中的所有节点都是吗?嗯,“模型”作为模型实例的图形,是的。但是它不止一个对象实例(而且不止一种类型,尽管它们都遵循一个接口)。在您的模型中,您试图验证的对象是否有权访问其父对象?换句话说,是否存在
.parent
属性?嗨,史蒂夫-不,而且不应该涉及模型本身。验证器是对模型实例的预提交。您能举一个显示父控制器和子控制器的代码示例吗你如何对他们进行验证?@uosɐſ,你能找到解决方案吗?不,我想我没有。对不起