基于 id 的自定义错误消息

本文关键字:错误 消息 自定义 id 基于 | 更新日期: 2023-09-27 18:32:50

我正在使用 for 循环在 html 表中显示表中的记录。在每一行中,Amount值的格式会有所不同 - 有些将有 4 位小数,一些将有 3 位小数,有些将是货币。如果您查看 textboxfor 部分,您还将看到我正在使用一种Format方法根据CategoryId格式化数据。

此外,一些Amount是百分比,需要验证以查看它们是否小于 1。问题是它们都使用相同的Amount属性,因此简单地使用 Validation 属性进行装饰是很棘手的。

我使用 [Required] 属性没有问题(见下文(。但是,我不确定如何验证百分比。有没有办法使用CategoryId生成将在ValidationMessageFor中看到的自定义错误消息?

@for (int i = 0; i < Model.AllGradesParamList.Count; i++)
{
    <tr>
        <td>
            @Model.CategoryList.Where(x => x.Id == Model.AllGradesParamList[i].CategoryId).Select(x => x.Name).FirstOrDefault()
            @Html.HiddenFor(model => Model.AllGradesParamList[i].CategoryId)
        </td>
        <td>
            @Html.TextBoxFor(x => Model.AllGradesParamList[i].Amount, new { @Value = Model.Format(Model.AllGradesParamList[i].Amount, Model.AllGradesParamList[i].CategoryId) })
            @Html.ValidationMessageFor(x => Model.AllGradesParamList[i].Amount)
        </td>
    </tr>
 }

部分类(类的其余部分是自动生成的,包括 CategoryId(:

[MetadataType(typeof(CS_Parameter_Statewide_AllGrades_ScenarioMetaData))]
public partial class CS_Parameter_Statewide_AllGrades_Scenario
{   
    public int Category { get; set; }
    public class CS_Parameter_Statewide_AllGrades_ScenarioMetaData
    {
        [Required]
        [ValidAmountAttribute("CategoryId")]
        public double Amount { get; set; }
    }
}

编辑:我也开始创建这个自定义属性,但它没有按照我想要的方式工作。与[Required]属性不同,无效值被发送到 post。如何防止值发布并在ValidationMessageFor中显示错误?

编辑:我尝试实现IClientValidatable似乎不起作用。在服务器端,我正在打电话给ModelState.IsValid并且正在工作,但它甚至不应该走那么远。我必须编写额外的Javascript才能让它工作吗?也许有些如何使用jQuery.validator.unobtrusive.adapters.add()

public class ValidAmountAttribute : ValidationAttribute, IClientValidatable // IClientValidatable for client side Validation
{
    private readonly string _categoryId;
    public ValidAmountAttribute(string categoryId)
    {
        _categoryId = categoryId;
    }
    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        var catId = validationContext.ObjectType.GetProperty(_categoryId).GetValue(validationContext.ObjectInstance, null);
        var amountProperty = validationContext.ObjectType.GetProperty("Amount");
        double amountValue = (double)amountProperty.GetValue(validationContext.ObjectInstance, null);
        if ((catId == 212 || catId == 213) && amountValue > 1)
        {
            return new ValidationResult("Amount is not valid");
        }
        return ValidationResult.Success;
    }
    // Implement IClientValidatable for client side Validation
    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
    {
        return new ModelClientValidationRule[] { new ModelClientValidationRule { ValidationType = "textbox", ErrorMessage = this.ErrorMessage } };
    }
}

基于 id 的自定义错误消息

您可以构建自己的自定义验证属性。

public class ValidAmount : ValidationAttribute
{
    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        string[] memberNames = { "Amount" };
        var amountProperty = validationContext.ObjectType.GetProperty("Amount");
        double amountValue = (double)amountProperty.GetValue(validationContext.ObjectInstance, null);
        // at this stage you have "amount value"
        // here you are verifying whether amount is less than 1
        if (amountValue<1)
        {
            // here you return your custom error message
            return new ValidationResult("Amount is not valid",memberNames);
        }
        return ValidationResult.Success;
    }
}

将自定义验证属性应用到模型/视图模型的属性中。喜欢这个-

    [ValidAmount]
    public double Amount { get; set; }

还可以在单个验证属性类中验证两个属性。 点击此链接 - 如何创建自定义验证属性?