asp.net-mvc - 以编程方式更改验证范围 (MVC3 ASP.NET)

标签 asp.net-mvc asp.net-mvc-3 validation

假设我有这个 View 模型:

公共(public)类 MyModel
{
[范围(0, 999, ErrorMessage = "无效数量")]
公共(public) int 数量 { 获取;放; }
}

现在,对于此模型的特定实例,有效值的范围将发生变化:有些可能不是 0,有些可能不高于 5。有效范围的最小/最大值来自数据库,并且可以随时更改。

如何即时更改 RangeAttribute 的最小/最大属性?或者验证我的方案的最佳方法是什么?

最佳答案

类似这样的东西可能更适合你的追求......

View 模型:

public class ViewModel
{
    public DateTime MinDate {get; set;}
    public DateTime MaxDate {get; set;}

    [DynamicRange("MinDate", "MaxDate", ErrorMessage = "Value must be between {0} and {1}")]
    public DateTime Date{ get; set; }
}

图书馆类或其他地方:
public class DynamicRange : ValidationAttribute, IClientValidatable
    {
        private readonly string _minPropertyName;
        private readonly string _maxPropertyName;

    public DynamicRange(string minPropName, string maxPropName)
    {
        _minPropertyName = minPropName;
        _maxPropertyName = maxPropName;
    }

    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        var minProperty = validationContext.ObjectType.GetProperty(_minPropertyName);
        var maxProperty = validationContext.ObjectType.GetProperty(_maxPropertyName);

        if(minProperty == null)
            return new ValidationResult(string.Format("Unknown property {0}", _minPropertyName));

        if (maxProperty == null)
            return new ValidationResult(string.Format("Unknown property {0}", _maxPropertyName));

        var minValue = (int) minProperty.GetValue(validationContext.ObjectInstance, null);
        var maxValue = (int) maxProperty.GetValue(validationContext.ObjectInstance, null);

        var currentValue = (int) value;

        if (currentValue <= minValue || currentValue >= maxValue)
        {
            return new ValidationResult(string.Format(ErrorMessage, minValue, maxValue));
        }

        return null;
    }

    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
    {
        var rule = new ModelClientValidationRule
            {
                ValidationType = "dynamicrange",
                ErrorMessage = ErrorMessage
            };

        rule.ValidationParameters["minvalueproperty"] = _minPropertyName;
        rule.ValidationParameters["maxvalueproperty"] = _maxPropertyName;
        yield return rule;
    }

发件人:MVC unobtrusive range validation of dynamic values

关于asp.net-mvc - 以编程方式更改验证范围 (MVC3 ASP.NET),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9296744/

相关文章:

javascript - 如何在我的 MVC 站点中制作 ExtJs DatePicker?

c# - 只返回 View 的 Controller Action 是否有必要异步?

asp.net-mvc-3 - 是否有一种更简洁的方法可以在 Razor 中的@variable 后面加上逗号

asp.net-mvc - 为什么我的 View 不包括 _Layout.cshtml?

javascript - 如何在 MVC 3 的 HTML 表格中使用幻灯片切换?

CSS3 验证

c# - 未调用 kendogrid 更新

c# - 如何为 ASP.NET MVC 5 创建依赖注入(inject)?

php - 如何使用 php 和 javascript 为特定结果显示正确的图像?

Angular 5 表单验证(必需)不起作用