通过结合允许尖括号(因此自定义标签)的正则表达式数据注释来实现这一点
[RegularExpression(@"([©a-zA-Z0-9\u0900-\u097f,\.\s\-\'\""!?\(\)\[\]\<\>\/]*)")]
和一个 ValidationAttribute 类,用于检查不需要的标签(LineBreak 和 Link 除外)
public class CustomTagValidatorAttribute : ValidationAttribute
{
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
Regex re = new Regex(@"(<(?!(LineBreak\s*|Link\s+[\s\w\'\""\=]*)\/?>))", RegexOptions.Multiline);
return re.Match(value.ToString()).Length == 0 ? ValidationResult.Success : new ValidationResult(Resources.ErrorStrings.InvalidValuesInRequest);
}
}
这两个属性都应用于类属性,如下所示 -
[CustomTagValidator]
[RegularExpression(@"([©a-zA-Z0-9\u0900-\u097f,\.\s\-\'\""!?\(\)\[\]\<\>\/]*)")]
public string PropertyToValidate { get; set; }
还添加了一个 ActionFilterAttribute 以确保在调用控制器操作之前执行验证检查 -
public class ValidateModelAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(HttpActionContext actionContext)
{
if (actionContext.ModelState.IsValid == false)
{
actionContext.Response = actionContext.Request.CreateErrorResponse(
HttpStatusCode.BadRequest, actionContext.ModelState);
}
}
}
并将其应用于相关的控制器操作,如下所示 -
[ValidateModel]
public HttpResponseMessage Post([FromBody] MyModel mm)
希望这可以帮助遇到类似问题的人。
几乎忘记了,使用相同的基于正则表达式的 javascript 验证在客户端应用了相同的解决方案。