【问题标题】:How to create regularExpressionAttribute with dynamic pattern come from model property如何创建具有动态模式的regularExpressionAttribute来自模型属性
【发布时间】:2011-05-26 11:25:56
【问题描述】:
public class City
{
   [DynamicReqularExpressionAttribute(PatternProperty = "RegEx")]
   public string Zip {get; set;}
   public string RegEx { get; set;} 
}

我想在模式来自其他属性的情况下创建此属性,而不是像在原始 RegularExpressionAttribute 中那样声明静态。

任何想法都将不胜感激 - 谢谢

【问题讨论】:

    标签: c# validation asp.net-mvc-3 attributes


    【解决方案1】:

    字里行间的东西应该符合要求:

    public class DynamicRegularExpressionAttribute : ValidationAttribute
    {
        public string PatternProperty { get; set; }
    
        protected override ValidationResult IsValid(object value, ValidationContext validationContext)
        {
            PropertyInfo property = validationContext.ObjectType.GetProperty(PatternProperty);
            if (property == null)
            {
                return new ValidationResult(string.Format("{0} is unknown property", PatternProperty));
            }
            var pattern = property.GetValue(validationContext.ObjectInstance, null) as string;
            if (string.IsNullOrEmpty(pattern))
            {
                return new ValidationResult(string.Format("{0} must be a valid string regex", PatternProperty));
            }
    
            var str = value as string;
            if (string.IsNullOrEmpty(str))
            {
                // We consider that an empty string is valid for this property
                // Decorate with [Required] if this is not the case
                return null;
            }
    
            var match = Regex.Match(str, pattern);
            if (!match.Success)
            {
                return new ValidationResult(this.FormatErrorMessage(validationContext.DisplayName));
            }
    
            return null;
        }
    }
    

    然后:

    型号:

    public class City
    {
        [DynamicRegularExpression(PatternProperty = "RegEx")]
        public string Zip { get; set; }
        public string RegEx { get; set; }
    }
    

    控制器:

    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            var city = new City
            {
                RegEx = "[0-9]{5}"
            };
            return View(city);
        }
    
        [HttpPost]
        public ActionResult Index(City city)
        {
            return View(city);
        }
    }
    

    查看:

    @model City
    @using (Html.BeginForm())
    {
        @Html.HiddenFor(x => x.RegEx)
    
        @Html.LabelFor(x => x.Zip)
        @Html.EditorFor(x => x.Zip)
        @Html.ValidationMessageFor(x => x.Zip)
    
        <input type="submit" value="OK" />
    }
    

    【讨论】:

    • 嗨达林很棒的解决方案,但它不适用于客户端 unobtrustiv 验证 Philipp
    • @Philipp Troxler,这很正常。我没有实现它,因为客户端验证不是您问题的一部分。为此,您可以使该属性实现 IClientValidatable 并注册一个自定义 jQuery 适配器。这是一个可能会让您走上正轨的示例:stackoverflow.com/questions/4784943/…
    • 太棒了,至少我没有得到那个 EntityValidationException,我现在得到了一些希望:) 我得到的是 PropertyInfo property = validationContext.ObjectType.GetProperty(PatternProperty);返回null,所以现在异常是“MyExpression”是未知属性。已经花了2天时间找到这个,你能帮帮我吗?谢谢:)
    【解决方案2】:

    重写以ValidationContext为参数的Validate方法,使用ValidationContext从相关属性中获取正则表达式字符串并应用正则表达式,返回匹配值。

    【讨论】:

      猜你喜欢
      • 2011-12-09
      • 1970-01-01
      • 2015-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多