MVC ValidationMessage用于动态保留小数位数

时间:2018-10-03 11:09:23

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

我需要在教科书输入中强制使用动态的小数位数。我已经看到了使用属性属性和正则表达式强制设置一定数量的小数位的堆栈溢出示例。

我的要求是动态的。 @ Html.TextBoxFor()是动态生成的,每个链接到一个具有自己的小数位要求的属性。因此,如果结果需要3个小数位,即使结果为1,也必须输入1.000。但是,下一个结果可能需要5个小数位,因此必须为1.00000。

属性是

List<Result> results

结果为

public class Result{

public float NumericResult;

public int DecimalPlaceRequired;

}

在MVC中实现这种动态验证的最佳方法是什么?

1 个答案:

答案 0 :(得分:3)

您可以尝试编写继承自ValidationAttributeoverride方法的客户验证属性。

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; }

}

这是给您的样品

c# online