使用ViewModel验证

时间:2012-10-10 17:41:27

标签: c# asp.net-mvc entity-framework ado.net

我有一个asp.net mvc3 w / ado.net实体框架做了一些验证。

我已经创建了一个viewmodel

public class id
{


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

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

是否可以添加一些验证规则,以使l_id必须大于v_id?验证应在用户提交页面后完成。怎么做?任何教程?此验证是否需要在控制器中完成或使用部分类?那里有没有例子

4 个答案:

答案 0 :(得分: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(imho)中存在一个准错误,在某些情况下会调用该验证方法两次(就像此ViewModel也被用作另一个ViewModel的成员那样发布

ValidationResult构造函数的第二个参数是验证绑定到的属性的名称,因此在这种情况下,View中l_ID的ValidatorFor标记会在其中显示“Bad thing”消息。

答案 1 :(得分:1)

ViewModel以MVVM模式存在,对于你和MVC你使用Controller,Model和View

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

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

答案 2 :(得分: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;           
    }           
}     

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

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

祝你好运!

答案 3 :(得分:0)

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