C# 创建自定义错误消息,其中包含来自其他属性的数据
在我的视图模型中,我有一个具有以下属性的对象:C# 创建自定义错误消息,其中包含来自其他属性的数据,c#,jquery,asp.net-mvc,C#,Jquery,Asp.net Mvc,在我的视图模型中,我有一个具有以下属性的对象: [Display(Name = "Fiscal Year")] [ValidFiscalYear(FiscalYear = "FiscalYear", ErrorMessage = "Please enter a valid fiscal year.")] public int FiscalYear { get; set; } 该属性有一个属性validfscalyear,该属性有一个名为FiscalYear的字符串参数。我使用此参数获取另一个名
[Display(Name = "Fiscal Year")]
[ValidFiscalYear(FiscalYear = "FiscalYear", ErrorMessage = "Please enter a valid fiscal year.")]
public int FiscalYear { get; set; }
该属性有一个属性validfscalyear
,该属性有一个名为FiscalYear
的字符串参数。我使用此参数获取另一个名为FiscalYear
的模型属性的值。反过来,此属性用于确定验证
以下是视图模型中的FiscalYear
属性:
[Required]
[Display(Name = "FiscalYear")]
public int FiscalYear { get; set; }
以下是属性:
public sealed class ValidFiscalYearAttribute : ValidationAttribute, IClientValidatable
{
public string FiscalYear { get; set; }
public override bool IsValid(object value)
{
if (value == null)
{
return false;
}
var currentFiscalYearString = HttpContext.Current.Request[FiscalYear];
var currentFiscalYear = int.Parse(currentFiscalYearString);
var fiscalYear = (int)value;
return fiscalYear >= currentFiscalYear && fiscalYear <= currentFiscalYear + 10;
}
public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
{
return new ModelClientValidationRule[] { new ModelClientValidationRule
{
ValidationType = "fiscalyear",
ErrorMessage = this.ErrorMessage }
};
}
}
公共密封类ValidScaleYearAttribute:ValidationAttribute,IClientValidable
{
公共字符串FiscalYear{get;set;}
公共覆盖布尔值有效(对象值)
{
如果(值==null)
{
返回false;
}
var currentFiscalYearString=HttpContext.Current.Request[FiscalYear];
var currentFiscalYear=int.Parse(currentFiscalYearString);
var fiscalYear=(int)值;
return-fiscalYear>=currentFiscalYear&&fiscalYear=currentFiscalYear&&value您可以通过设置ErrorMessage
属性来创建自定义错误消息
public sealed class ValidFiscalYearAttribute : ...
{
public ValidFiscalYearAttribute()
{
ErrorMessage = "My custom message";
}
...
}
您的自定义验证器继承此属性。您需要将“当前会计年度”从服务器传递到客户端,因为只有服务器知道该值。您可以使用以下语法获取从服务器传递的额外值
public sealed class ValidFiscalYearAttribute : ...
{
public ValidFiscalYearAttribute()
{
ErrorMessage = "My custom message";
}
...
}
jQuery.validator.unobtrusive.adapters.add("fiscalyear", ["currentfiscalyear"], function (options) {
options.rules["fiscalyear"] = options.params.currentfiscalyear;
options.messages["fiscalyear"] = options.message;
jQuery.validator.unobtrusive.parse();
});
jQuery.validator.addMethod('fiscalyear', function (value, element, param) {
var currentFiscalYear = parseInt(param);
return (value >= currentFiscalYear && value <= currentFiscalYear + 10);
});
jQuery.validator.unobtrusive.adapters.add(“fiscalyear”,[“currentfiscalyear”],函数(选项){
options.rules[“fiscalyear”]=options.params.currentfiscalyear;
options.messages[“fiscalyear”]=options.message;
jQuery.validator.unobtrusive.parse();
});
jQuery.validator.addMethod('fiscalyear',函数(值、元素、参数){
var currentFiscalYear=parseInt(参数);
返回(value>=currentFiscalYear&&value=currentFiscalYear&&fiscalYear我可以在该自定义错误消息中使用视图模型中的属性值吗?然后我可以在客户端使用相同的错误消息吗?我不确定如何使用它来帮助我的情况。由于某种原因,字符串属性fiscalYear
在它应该从[validfscalyear(FiscalYear=“FiscalYear”)]
接收字符串“FiscalYear”。因此,当执行HttpContext
请求时,它没有要查找的内容。我硬编码了字符串“FiscalYear”在请求中,它能够找到会计年度值。究竟什么是FiscalYear?是用户在网页上设置的值吗?如果是这样的话,您不必这样获得它。“值”IsValid方法的参数为您提供了值。我实际上认为FiscalYear是服务器已经知道的东西。您可以在这里详细介绍一下数据流吗?FiscalYear是视图模型中的另一个属性。该值由控制器在运行时设置。它是从数据库中提取的。OP已被编辑为了将其包含在代码示例中,您有一个名为FiscalYear的属性,您已经对其应用了ValidScalYearAttribute。如果这是您试图获取的属性值,您可以在IsValid方法中使用参数“value”来实现这一点。您能确认是否确实设置了“value”吗?在这种情况下,您甚至不需要“财政部"属性中的属性这很容易混淆,因为有两个属性具有相同的名称--一个是另一个对象的属性。是的,我试图使用validfscalyearAttribute
获取属性,但我使用另一个FiscalYear
属性的值来验证和创建错误消息ondFiscalYear
属性和currentFiscalYear
变量具有相同的值。
public sealed class ValidFiscalYearAttribute : ValidationAttribute, IClientValidatable
{
public ValidFiscalYearAttribute() : base("Fiscal Year must be between {0} and {1}.")
{
}
public string FiscalYear { get; set; }
public override string FormatErrorMessage(string name)
{
var currentFiscalYearString = HttpContext.Current.Request[FiscalYear];
var currentFiscalYear = int.Parse(currentFiscalYearString);
return string.Format(ErrorMessageString, currentFiscalYear, currentFiscalYear + 10);
}
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
// You should not check for null but should not return an error as return error for null should be the responsibility of the Required attribute
if(value == null) return null;
var currentFiscalYearString = HttpContext.Current.Request[FiscalYear];
var currentFiscalYear = int.Parse(currentFiscalYearString);
var fiscalYear = (int)value;
var valid = fiscalYear >= currentFiscalYear && fiscalYear <= currentFiscalYear + 10;
if (!valid)
{
var message = FormatErrorMessage(validationContext.DisplayName);
return new ValidationResult(message);
}
return null;
}
public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
{
var currentFiscalYearString = HttpContext.Current.Request[FiscalYear];
var currentFiscalYear = int.Parse(currentFiscalYearString);
var rule = new ModelClientValidationRule();
rule.ErrorMessage = FormatErrorMessage(metadata.GetDisplayName());
rule.ValidationType = "fiscalyear";
rule.ValidationParameters.Add("currentfiscalyear", currentFiscalYear);
yield return rule;
}
}