我需要在教科书输入中强制使用动态的小数位数。我已经看到了使用属性属性和正则表达式强制设置一定数量的小数位的堆栈溢出示例。
我的要求是动态的。 @ Html.TextBoxFor()是动态生成的,每个链接到一个具有自己的小数位要求的属性。因此,如果结果需要3个小数位,即使结果为1,也必须输入1.000。但是,下一个结果可能需要5个小数位,因此必须为1.00000。
属性是
List<Result> results
结果为
public class Result{
public float NumericResult;
public int DecimalPlaceRequired;
}
在MVC中实现这种动态验证的最佳方法是什么?
答案 0 :(得分:3)
您可以尝试编写继承自ValidationAttribute
和override
方法的客户验证属性。
override ValidationResult IsValid(object value, ValidationContext validationContext)
从DecimalPlaceRequired
实例获取validationContext.ObjectInstance
值。然后由Regex
有效。
public class CutomerAuthAttribute : ValidationAttribute
{
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
var model = validationContext.ObjectInstance as Result;
if (model != null)
{
string pattern = GetPattern(model);
if (Regex.IsMatch(value.ToString(), pattern))
{
return null;
}
}
return new ValidationResult("Please input correct float number");
}
private string GetPattern(Result model)
{
string pattern = "^[+]?[0-9]+";
if (model.DecimalPlaceRequired > 0)
pattern += "[.][0-9]{" + model.DecimalPlaceRequired + "}";
pattern += "$";
return pattern;
}
}
在CutomerAuth
属性上添加NumericResult
属性。
public class Result
{
[CutomerAuth]
public float NumericResult { get; set; }
public int DecimalPlaceRequired { get; set; }
}
这是给您的样品