解决 CustomValidationAttribute没有't work

龙4ik

会员
已加入
2020年10月24日
留言内容
16
编程经验
Beginner
你好大家!
其实这个问题是 ,但是现在我在ASP.Net MVC上遇到相同的问题
我有以下任务:编写验证属性,该属性检查是否正确将String格式解析为DateTimeOffset,如果不是,则应用程序应引发Exception。我试图从中获得解决方案 堆栈溢出,但是它不起作用,我也无法理解为什么。

MyCustomAttribute代码:
C#:
 public class DateStringAttribute : ValidationAttribute
    {
        protected override ValidationResult IsValid(object value, ValidationContext validationContext)
        {
            string date = value.ToString();
            var format = "ddd MMM dd yyyy HH:mm:ss 'GMT'zzzz";
            IFormatProvider provider = CultureInfo.InvariantCulture.DateTimeFormat;

            DateTimeOffset startDate;

            if (!DateTimeOffset.TryParseExact(date, format, provider, DateTimeStyles.AllowWhiteSpaces, out startDate))
            {
                throw new Exception("Something went wrong");
            }


            return ValidationResult.Success;
        }
    }

型号代码:
C#:
public class EventModel
    {
        [DateString]
        public string Date { get; set; }
    }

控制器代码:
C#:
 public class 首页Controller : Controller
    {
        private readonly ILogger<HomeController> _logger;

        public 首页Controller(ILogger<HomeController> logger)
        {
            _logger = logger;
        }

        public IActionResult Index()
        {
            EventModel eventModel = new EventModel { Date = "2014年8月30日星期五00:00:00 GMT + 0300" };
            return Content($"{eventModel.Date}");
        }

        public IActionResult Privacy()
        {
            return View();
        }

        [ResponseCache(Duration = 0, 地点 = ResponseCacheLocation.None, NoStore = true)]
        public IActionResult Error()
        {
            return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });
        }
    }

我看到这是一个简单的问题,但是有人可以向我解释为什么它不起作用以及如何使其起作用吗?
感谢您的任何帮助!!!
 
Solution
I haven't inherited ValidationAttribute for some time but I'm fairly certain that the issue is the fact that you're throwing an exception when you shouldn't be. That method is supposed to return whether the input is valid or not. If it's not then you return an appropriate error message, e.g.
C#:
if (DateTimeOffset.TryParseExact(date, format, provider, DateTimeStyles.AllowWhiteSpaces, out startDate))
{
    return ValidationResult.Success;
}

return new ValidationResult("The input string was not in the correct format.")
Another option would be call ParseExact instead and return the error message that it produces:
C#:
try
{
    _ = DateTimeOffset.ParseExact(date, format, provider...

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,501
地点
悉尼,澳大利亚
编程经验
10+
您需要提供有关该问题的完整解释,其中包括您要实现的内容(检查),如何实现(检查)以及尝试时发生的情况(不检查)。您需要调试代码并确切解释实际行为与预期的不同之处和位置。"It doesn't work"不是解释。这意味着您仅查看了最终结果,而没有查看达到该结果的步骤。您需要运行项目并在代码执行时对其进行观察,以确保该代码遵循您期望的路径,并且每一行都符合您的期望。如果这样做,您甚至可以自己解决问题。如果没有,至少您可以向我们提供所有相关信息。如果您不知道如何使用断点等进行调试,则停止您正在做的事情并立即学习,然后回到该项目并使用您所学到的东西。
 

龙4ik

会员
已加入
2020年10月24日
留言内容
16
编程经验
Beginner
您需要提供有关该问题的完整解释,其中包括您要实现的内容(检查),如何实现(检查)以及尝试时发生的情况(不检查)。您需要调试代码并确切解释实际行为与预期的不同之处和位置。"It doesn't work"不是解释。这意味着您仅查看了最终结果,而没有查看达到该结果的步骤。您需要运行项目并在代码执行时对其进行观察,以确保该代码遵循您期望的路径,并且每一行都符合您的期望。如果这样做,您甚至可以自己解决问题。如果没有,至少您可以向我们提供所有相关信息。如果您不知道如何使用断点等进行调试,则停止您正在做的事情并立即学习,然后回到该项目并使用您所学到的东西。
以下字符串格式 2014年8月30日星期五00:00:00 GMT + 0300 是不正确的,也不应该被认为有效。因此,当我尝试使用该值初始化变量时,我希望会引发异常,但我的应用程序可以正常运行,并且返回字符串没有任何问题,甚至没有到达我引发异常的行。那是主要问题。
зображення_2021-01-27_113757.png

这就是为什么我认为MyCustomAttribute不起作用,也无法理解为什么忽略它的原因。
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,501
地点
悉尼,澳大利亚
编程经验
10+
因此,当您调试代码时,即设置一个断点并逐行逐步执行。哪一行代码的行为与您期望的不同以及如何变化?另外,当时确切使用了哪些数据?这是我在上一篇文章中告诉您的操作:调试代码并提供所有相关细节。
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,501
地点
悉尼,澳大利亚
编程经验
10+
以下字符串格式 2014年8月30日星期五00:00:00 GMT + 0300 是不正确的,也不应该被认为有效。
真?你有这个:
C#:
var format = "ddd MMM dd yyyy HH:mm:ss 'GMT'zzzz";
为什么会"2014年8月30日星期五00:00:00 GMT + 0300"对这种格式无效吗?我没有专门检查文档,但是对我来说看起来不错。
 

龙4ik

会员
已加入
2020年10月24日
留言内容
16
编程经验
Beginner
真?你有这个:
C#:
var format = "ddd MMM dd yyyy HH:mm:ss 'GMT'zzzz";
为什么会"2014年8月30日星期五00:00:00 GMT + 0300"对这种格式无效吗?我没有专门检查文档,但是对我来说看起来不错。
因为不会解析此值。有效字符串为"Sat 2014年8月30日00:00:00 GMT + 0300"
 

龙4ik

会员
已加入
2020年10月24日
留言内容
16
编程经验
Beginner
因此,当您调试代码时,即设置一个断点并逐行逐步执行。哪一行代码的行为与您期望的不同以及如何变化?另外,当时确切使用了哪些数据?这是我在上一篇文章中告诉您的操作:调试代码并提供所有相关细节。
我希望当我尝试在Index操作中返回不适当的值时会抛出异常,但事实并非如此。我希望在输出中看到ExceptionThrown消息,但不会看到在上一篇文章中的图像上显示的字符串。
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,501
地点
悉尼,澳大利亚
编程经验
10+
因为不会解析此值。有效字符串为"Sat 2014年8月30日00:00:00 GMT + 0300"
瞧,这就是为什么您需要一开始就解释这个问题的原因。您为什么要假设我们知道2014年特定日期是星期几?您浪费了我们的时间,没有正确地解释自己,直到我两次提示您这样做。请学习该课程,并在将来一开始就提供所有相关信息。
 
Last edited:

龙4ik

会员
已加入
2020年10月24日
留言内容
16
编程经验
Beginner
而且我还没有继承

瞧,这就是为什么您需要一开始就解释这个问题的原因。您为什么要假设我们知道2014年特定日期是星期几?您浪费了我们的时间,没有正确地解释自己,直到我两次提示您这样做。请学习该课程,并在将来一开始就提供所有相关信息。
我的错,对不起。但是你能说为什么它不按我的预期工作吗?
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,501
地点
悉尼,澳大利亚
编程经验
10+
I haven't inherited ValidationAttribute for some time but I'm fairly certain that the issue is the fact that you're throwing an exception when you shouldn't be. That method is supposed to return whether the input is valid or not. If it's not then you return an appropriate error message, e.g.
C#:
if (DateTimeOffset.TryParseExact(date, format, provider, DateTimeStyles.AllowWhiteSpaces, out startDate))
{
    return ValidationResult.Success;
}

return new ValidationResult("The input string was not in the correct format.")
Another option would be call ParseExact instead and return the error message that it produces:
C#:
try
{
    _ = DateTimeOffset.ParseExact(date, format, provider, DateTimeStyles.AllowWhiteSpaces);

    return ValidationResult.Success;
}
catch (Exception e)
{
    return new ValidationResult(e.Message);
}
 

类似线程

最佳 底部