繁体   English   中英

使用ViewModel验证

[英]Validation with ViewModel

我有一个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? 验证应在用户提交页面后完成。 怎么做? 任何教程? 此验证是否需要在控制器中完成或使用部分类? 那里有什么例子吗?

我一直在使用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”消息。

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

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

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;           
    }           
}     

您现在需要做的是找到示例自定义属性并使其适应以使用上述属性。

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

祝好运!

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM