1

我有一个带有 ado.net 实体框架的 asp.net mvc3 进行一些验证。

我已经创建了一个视图模型

public class id
{


    [Required]
    public decimal l_ID
    {
        get;
        set;
    }

    [Required]
    public decimal v_ID
    {
        get;
        set;
    }
}

是否可以添加一些验证规则以使 l_id 必须大于 v_id?一旦用户提交了页面,就应该进行验证。这将如何完成?有教程吗?这个验证需要在控制器中完成还是使用部分类?有没有例子

4

4 回答 4

2

我一直在使用 IValidatable 接口,与自定义属性验证相比,它相当简单。这是代码:

public class id : IValidatableObject
    {
        [Required]
        public decimal l_ID { get; set; }

        [Required]
        public decimal v_ID { get; set; }

        private bool _hasBeenValidated = false;

        public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
        {

            if (!_hasBeenValidated)
            {
                // validation rules go here. 
                if (l_ID <= v_ID)
                    yield return new ValidationResult("Bad thing!", new string[] { "l_ID" });
            }

            _hasBeenValidated = true;
        }
    }

需要注意的是,当从将 ViewModel 作为参数的 POST 操作发生绑定时,将自动调用 Validate 方法,因此您不必对事件进行任何连接。事情就在那里,bool _hasBeenValidated因为现在 MVC3(恕我直言)中有一个准错误,在某些情况下会调用该验证方法两次(比如当这个 ViewModel 也被用作另一个 ViewModel 的成员并且被发布时

ValidationResult 构造函数的第二个参数是验证绑定到的属性的名称,因此在这种情况下,您的视图中 l_ID 的 ValidatorFor 标记将在其中收到“坏事”消息。

于 2012-10-10T18:16:26.670 回答
1

ViewModel 存在于 MVVM 模式中,对于您和 MV​​C,您使用 Controller、Model 和 View

是的,您可以在模型中添加 DataAnnotation。

链接:http ://www.asp.net/mvc/tutorials/older-versions/models-%28data%29/validation-with-the-data-annotation-validators-cs

于 2012-10-10T17:56:06.837 回答
1

您需要创建一个自定义验证属性 - 网络上有很多帮助。以下是对类似依赖属性的改编。

public class GreaterThanOtherAttribute : ValidationAttribute, IClientValidatable
{
    public string DependentProperty { get; set; }

    public GreaterThanOtherAttribute (string dependentProperty)
    {
        this.DependentProperty = dependentProperty;
    }

    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        // get a reference to the property this validation depends upon
        var containerType = validationContext.ObjectInstance.GetType();
        var field = containerType.GetProperty(this.DependentProperty);

        if (field != null)
        {
            // get the value of the dependent property
            var dependentvalue = field.GetValue(validationContext.ObjectInstance, null);

            // compare the value against the target value
            if ((dependentvalue == null && this.TargetValue == null) ||
                (dependentvalue != null && dependentvalue < this.TargetValue)))
            {
                // match => means we should try validating this field
                return new ValidationResult(this.ErrorMessage, new[] { validationContext.MemberName });
            }
        }

        return ValidationResult.Success;
    }

然后装饰你的模型:

public class id           
{      
    [Required]           
    public decimal l_ID           
    {           
        get;           
        set;           
    }           

    [Required]   
    [GreaterThanOtherAttribute("l_ID")]        
    public decimal v_ID           
    {           
        get;           
        set;           
    }           
}     

您现在需要做的是找到一个示例自定义属性并对其进行调整以使用上述内容。

健康警告 - 未经任何测试,可能包含错误。

祝你好运!

于 2012-10-10T18:09:02.743 回答
0

我建议您使用Fluent Validation组件。它可以与 Asp.Net MVC 集成,您可以使用流利的 sintaxe 轻松添加一些验证规则。DataAnnotations 也可以正常工作,但我不喜欢,因为它会污染您的域模型或视图模型。我喜欢创建一个单独的职责结构。

于 2012-10-10T18:05:22.067 回答