向自定义正则表达式添加动态错误消息

     2023-04-13     273

关键词:

【中文标题】向自定义正则表达式添加动态错误消息【英文标题】:Add dynamic error message to custom regular expression 【发布时间】:2019-12-05 04:04:10 【问题描述】:

我已经建立了一个自定义的正则表达式类。我还有一个数据库值,它是我不希望在我的 Web 应用程序中的任何位置允许的字符列表。我的自定义正则表达式类将采用所有其他正则表达式,并确保不允许我的不需要的字符列表。我的自定义正则表达式类在我的 Global.asax.cs 中注册,并且由于它是数据库中的一个值,因此可以在必要时进行更改。现在我需要做的是找到一种方法来获取正则表达式错误消息并添加类似的内容:“此字段不能包含以下内容:” + mybadcharacterlist;

已经试过了:

public const string AlphaErrMsg = "此字段只能包含字母,此字段不能包含以下字符:" + RestrictedCharacterList.GetList();

这不起作用,因为 RegularExpressionAttribute 的错误参数需要一个 const 并且调用我的 GetList 方法不是一个常量。

protected void Application_Start()

    DataAnnotationsModelValidatorProvider.RegisterAdapter(typeof   (RestrictCharRegExpressAttribute), typeof(RegulatExpressionAttributeAdapter);

public class RestrictCharRegExpressAttribute : RegularExpressionAttribute

    public RestrictCharRegExpressAttribute(string propRegex) : base(GetRegex(propRegex)) 

    private static string GetRegex(string propRegex)
    
        in indexPropRegex = propRegex.IndexOf('^');
        string restrictedCharsAction = "(?!.*[" + RestrictedCharacterList.GetList() + "])";
        propRegex = indexPropRegex == -1 ? propRegex.Insert(0, restrictedCharsAction) : propRegex.Insert(indexPropRegex + 1, restrictedCharsAction);
        return propRegex;
    

public static class RestrictedCharacterList

    public static string GetList()
    
         string restrictedChars;
         if (HttpContext.Current?.Session == null)
         
             restrictedChars = EnvironmentSettingsDA.GetSetting(AppConfiguration.Settings.ConnectionString, "CAMPS", "RESTRICTED_CHARACTERS");
         
         else
         
             restrictedChars = HttpContext.Current.Session.GetDataFromSession<string>("RESTRICTED_CHARACTERS");
             if (restrictedChars == null)
             
                 restrictedChars = EnvironmentSettingsDA.GetSetting(AppConfiguration.Settings.ConnectionString, "CAMPS", "RESTRICTED_CHARACTERS");
                 HttpContext.Current.Session.SetDataToSession<string>("Restricted_Characters", restrictedChars);
             
         
    return restrictedChars;
    

public class User 

    public const string IsAlphaRegex = "^[a-zA-Z]*$'

    public const string AlphaErrMsg = "This field can only contain letters.";

    [RestrictCharRegExpress(IsAlphaRegex, ErrorMessage = AlphaErrMsg)]
    public string FirstName  get; set; 

预期的结果是在我的所有正则表达式错误消息中添加一条消息,描述不允许使用哪些字符,同时确保可以在数据库中更改字符列表。

【问题讨论】:

注意"^[a-zA-Z]*$ 应该以" 结尾。字符列表中需要转义的字符是\]^-。所以,使用RestrictedCharacterList.GetList().Replace("^","\\^")).Replace("\\","\\\\")).Replace("]","\\]")).Replace("-","\\-") @WiktorStribiżew 出于某种原因,我不必这样做。当从数据库中提取字符时,C# 可能会自行转义它们?无论哪种方式,我都不必执行任何特殊的替换命令。 那么你最终会得到与你期望不同的匹配的损坏模式。 @WiktorStribiżew 此评论适用于将来可能会看到此页面的任何其他人。维克托你完全正确,我错了。我之前没有任何问题,因为我并没有试图排除这些字符,但是他们需要阻止反斜杠并且它不起作用。我包括了你的建议,它工作正常。所以谢谢你。 【参考方案1】:

你这样做的方法是覆盖 RestrictCharRegExprAttribute 中的 FormatErrorMessage:

public class RestrictCharRegExprAttribute: RegularExpressionAttribute

    public RestrictCharRegExpressAttribute(string propRegex): base( GetRegex(propRegex)
    
         this.Message = ...; // localized message
    

    private string Message  get; 

    public override string FormatErrorMessage(string propertyName)
    
        return this.Message; 
    


【讨论】:

那么我如何添加到现有的错误消息而不是用本地化消息覆盖它?此方法将仅显示本地化消息。另一种说法是,这只会显示“此字段不能包含以下字符:123”与“此字段只能包含字母。此字段不能包含以下字符:123” 只需调用 base.FormatErrorMessage 并随心所欲地使用。【参考方案2】:

特别感谢 Review Alot 引导我走上正确的道路,但这是我为完成我想做的事情所做的。

在 RestrictedCharacterList 类中添加了以下内容:

public static class RestrictedCharacterList

    public static string GetErrorMessage()
    
        return " Valid values cannot include the following restricted characters: " + GetList();
    

在 RestrictCharRegExpressAttribute 类中添加了以下内容:

public class RestrictCharRegExpressAttribute : RegularExpressionAttribute

    public string AddToRestrictCharErrorMessage  get; set; 
    public override string FormatErrorMessage(string name)
    
        if (string.isNullOrWhiteSpace(AddToRestrictedCharErrorMessage))
        
            return base.FormatErrorMessage(name);
        
        else
        
            return AddToRestrctCharErrorMessage + " " + RestrictedCharacterList.GetErrorMessage():
        
    

然后,当您希望将特殊字符消息附加到现有错误消息时,您可以像这样分配 data 属性:

public class User 

    public const string IsAlphaRegex = "^[a-zA-Z]*$'

    public const string AlphaErrMsg = "This field can only contain letters.";

    [RestrictCharRegExpress(IsAlphaRegex, AddToRestrictCharErrorMessage = AlphaErrMsg)]
    public string FirstName  get; set; 


【讨论】:

向自定义 React 组件添加额外的类名

】向自定义React组件添加额外的类名【英文标题】:AddadditonalclassnamestocustomReactcomponent【发布时间】:2019-06-2000:15:45【问题描述】:我想知道如何向自定义React组件(如Button)添加额外的类名。到目前为止,我已经尝试过使用class1... 查看详情

java示例代码_向自定义控件添加侦听器

java示例代码_向自定义控件添加侦听器 查看详情

向自定义 UIButton 添加约束不起作用

】向自定义UIButton添加约束不起作用【英文标题】:AddingconstraintstoacustomUIButtondoesn\'twork【发布时间】:2017-02-1321:39:16【问题描述】:您好,我有以下代码:classMyControlleroverridefuncviewDidLoad()self.addButtons()super.viewDidLoad()funcaddButtons()le... 查看详情

向自定义视图中的 UIButton 添加操作

】向自定义视图中的UIButton添加操作【英文标题】:AddactiontoUIButtonwhichinacustomview【发布时间】:2010-12-1709:36:54【问题描述】:我有一个自定义视图,它有一个UIButton。我把这个视图加到我的navigationItem的rightbarButtonItem,没关系,... 查看详情

向自定义错误页发送错误请求

##Sendsbadrequeststocustomized##errorpagesErrorDocument401/error/401.phpErrorDocument403/error/403.phpErrorDocument404/error/404.phpErrorDocument500/error/500.php 查看详情

如何向自定义 UIWebview 添加“打开方式”功能?

】如何向自定义UIWebview添加“打开方式”功能?【英文标题】:Howdoyouadda"Openin.."FunctiontoacustomUIWebview?【发布时间】:2016-04-2016:30:42【问题描述】:我正在尝试使用UIDocumentInteractionController()使用UIwebview创建“打开方式...”... 查看详情

在 Eureka 中向自定义规则添加规则

】在Eureka中向自定义规则添加规则【英文标题】:AddingaruletoacustomruleinEureka【发布时间】:2017-06-0111:36:54【问题描述】:所以我创建了一个自定义行,它只是一个简单的UITextView行现在我想创建一个规则,如果UITextView的字符数少... 查看详情

我可以向自定义快餐栏添加边距(扩展 BaseTransientBottomBar)吗?

】我可以向自定义快餐栏添加边距(扩展BaseTransientBottomBar)吗?【英文标题】:CanIaddmarginstoacustomsnackbar(extendsBaseTransientBottomBar)?【发布时间】:2020-09-0213:00:21【问题描述】:我有一堂课:publicfinalclassMySnackbar<T>extendsBaseTransie... 查看详情

使用 UIBezierPath 将半径设置为某些角并向自定义 UIButton 添加阴影

】使用UIBezierPath将半径设置为某些角并向自定义UIButton添加阴影【英文标题】:usingUIBezierPathforsettingradiustosomecornersandaddingshadowtoCustomUIButton【发布时间】:2016-02-1010:20:52【问题描述】:我有一个自定义UIButton。我想将半径添加到某... 查看详情

带有动态错误消息的jquery验证添加方法[重复]

...。我正在使用Add方法,但想根据输入的值有什么问题来自定义错误消息。我正在使用moment.js进行日期验证。所以第一次检查 查看详情

向正则表达式添加动态值

】向正则表达式添加动态值【英文标题】:addingdynamicvaluestoregex【发布时间】:2022-01-1423:56:22【问题描述】:我有一个正则表达式,我检查输入是否有6位数字。我可以用下面的refgex来实现它/^\\d6$/gm.test("123456")我在多个地方都使... 查看详情

java示例代码_Java 1.4中如何向自定义类添加迭代器的示例

java示例代码_Java 1.4中如何向自定义类添加迭代器的示例 查看详情

如何在 Angular 中添加动态正则表达式模式

】如何在Angular中添加动态正则表达式模式【英文标题】:HowtoaddDynamicregexpatterninAngular【发布时间】:2021-04-1322:28:17【问题描述】:如何在角度中添加动态变量正则表达式模式预期输出123456.1点前最多6位,点后最多一位importDirectiv... 查看详情

c# 从远程 XML 文件动态添加正则表达式模式

】c#从远程XML文件动态添加正则表达式模式【英文标题】:c#addRegexpatterndynamicallyfromremoteXMLfile【发布时间】:2019-02-2114:00:15【问题描述】:我的正则表达式模式远程存储在XML文件中。我想在运行时将它们动态添加到我的应用程序... 查看详情

正则表达式错误 - 无需重复

】正则表达式错误-无需重复【英文标题】:regexerror-nothingtorepeat【发布时间】:2011-04-1003:54:02【问题描述】:我在使用这个表达式时收到一条错误消息:re.sub(r"([^\\s\\w])(\\s*\\1)+","\\\\1","...")我检查了RegExr的正则表达式,它按预期... 查看详情

如何编码以防止此错误消息来自正则表达式并通过单击关闭按钮随时关闭该表单?

】如何编码以防止此错误消息来自正则表达式并通过单击关闭按钮随时关闭该表单?【英文标题】:howcanIcodetopreventthiserrormessagefromregularexpressionandclosethatformanytimebyclickingclosebutton?【发布时间】:2021-05-3002:49:03【问题描述】:我为... 查看详情

需要和缺少 POSIX 正则表达式函数

】需要和缺少POSIX正则表达式函数【英文标题】:POSIXregexfunctionsrequiredandmissing【发布时间】:2014-09-2213:44:43【问题描述】:当我尝试使用msys2编译旧的c源代码时,会发生此错误:“配置:错误:POSIX正则表达式函数需要和缺失!... 查看详情

jmeter(三)关联之正则表达式提取器

...个HTTP请求GetCityCode,填写请求信息2、添加一个正则正则表达式提取器3、添加第2个HTTP请求GetWeatherInfo,填写请求信息,这里的$citycode就是获取正则表达式提取的参数值,citycode变量名与正则表达式提取器中的“引用名称”中填写... 查看详情