【问题标题】:Passing parameter to a custom validation attribute in ASP.NET MVC将参数传递给 ASP.NET MVC 中的自定义验证属性
【发布时间】:2017-08-24 12:18:11
【问题描述】:

我正在使用 ASP.NET MVC,我想创建一个自定义验证属性来验证来自文本输入的 StartTime 和 EndTime。

我试过了:

型号:

public class MyModel
{
    public bool GoldTime { get; set; }

    [TimeValidation(@"^\d{1,2}:\d{1,2}$", GoldTime, ErrorMessage = "Start time is invalid.")]
    public string StartTime { get; set; }

    [TimeValidation(@"^\d{1,2}:\d{1,2}$", GoldTime, ErrorMessage = "End time is invalid.")]
    public string EndTime { get; set; }
}

验证属性:

public class TimeValidationAttribute : ValidationAttribute
{
    private readonly string _pattern;
    private readonly bool _useGoldTime;

    public TimeValidationAttribute(string pattern, bool useGoldTime)
    {
        _pattern = pattern;
        _useGoldTime = useGoldTime;
    }

    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        if (_useGoldTime)
        {
            var regex = new Regex(_pattern);

            if (!regex.IsMatch(value.ToString()))
            {
                return new ValidationResult(ErrorMessage);
            }
        }

        return ValidationResult.Success;
    }
}

但我收到此错误消息:

非静态字段、方法或 属性“MyModel.GoldTime”

然后,我再次尝试将GoldTime(在模型中)更改为true,错误消息将消失。

所以,我的问题是:如何将参数GoldTime 传递给属性构造函数?我需要使用GoldTime 作为密钥来启用验证StartTime 和EndTime 的值。

谢谢!

【问题讨论】:

  • 您的参数需要是其他属性的名称,而不是其他属性的实际值(并且在您的方法中使用反射来获取其他属性的值)。我建议阅读The Complete Guide To Validation In ASP.NET MVC 3 - Part 2 以了解如何创建自定义验证属性
  • 附带说明,将string 用于似乎是日期或时间的属性是不合适的。而且您的正则表达式允许 90:80 我认为这也是无效的
  • @StephenMuecke 感谢您的链接和注释。我正在阅读文档。
  • 您真正想在这里验证什么?如果值应该是您的属性名称所暗示的时间,那么您的属性应该是TimeSpan,但不清楚GoldTime 的含义
  • @StephenMuecke 我使用GoldTime 作为密钥,以确保用户需要使用StartTime 和EndTime 的黄金时间。否则,StartTime 和 EndTime 将被忽略(无需更新到数据库)。

标签: c# asp.net asp.net-mvc


【解决方案1】:

它抱怨在属性定义中使用模型属性。相反,在您的自定义属性中,您可以使用 ValidationContext 类上的属性来获取底层模型,我认为是通过validationContext.ObjectInstance。

显然,您不想硬编码模型的类型,但您可以使用反射:

bool goldTime;
var prop = validationContext.ObjectInstance.GetType().GetProperty("GoldTime");
if (prop != null)
   goldTime = (bool)prop.GetValue(validationContext.ObjectInstance, null);

或者,为模型定义一个接口:

public interface ITimeModel
{
   bool GoldTime { get; set; }
}

然后寻找:

bool goldTime;
if (validationContext.ObjectInstance is ITimeModel)
  goldTime = ((ITimeModel)validationContext.ObjectInstance).GoldTime;

【讨论】:

  • 谢谢!我会试试的。
猜你喜欢
  • 2017-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-19
  • 1970-01-01
相关资源
最近更新 更多