Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 创建自定义错误消息,其中包含来自其他属性的数据_C#_Jquery_Asp.net Mvc - Fatal编程技术网

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
属性的值来验证和创建错误消息ond
FiscalYear
属性和
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;
    }
}