基于 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 } };
}
}
您可以构建自己的自定义验证属性。
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; }
还可以在单个验证属性类中验证两个属性。 点击此链接 - 如何创建自定义验证属性?