需要使用 MVC 中的表单验证从服务器端验证 DateTime

Need to validate the DateTime from server side using form validation in MVC

提问人:user2083386 提问时间:6/5/2019 更新时间:6/5/2019 访问量:786

问:

我有一个客户端验证,它限制用户仅在 20 年后的特定范围内输入日期。这工作正常。但问题是,当用户将他的浏览器时间改回 1 年时,浏览器允许输入大于 20 年后的日期。为此,我们使用 MVC。我们有 4 个选项卡,其中此验证应以第二种形式进行,但是当我们将所有表单保存在表单中并在最后一个选项卡中调用服务器端时,就会发生服务器端调用。我怎样才能做到这一点?

我已经在服务器端添加了一些验证,将用户限制在服务器端,但是当用户单击提交时,这发生在最后一个选项卡中。我想要的是,当用户单击“下一步”按钮时,或者至少在用户在第二个选项卡中输入日期值后立即发生,我希望发生此逻辑。我尝试的代码如下:

var enrolledVal = Convert.ToDateTime(model.enrolledValue);
var a = (today.Year * 100 + today.Month) * 100 + today.Day;
var b = (enrolledVal.Year * 100 + enrolledVal.Month) * 100 + enrolledVal.Day;
var enrolledYears = (a - b) / 10000;
if (enrolledYears > 20)
{
var error = new JsonErrorModel { ErrorCode = -1, ErrorMessage = "Enrolled Date Exceeded 20 years"};
return Json(error);
}
C# jQuery .NET 验证 服务器端

评论

2赞 Jake Steffen 6/5/2019
您可能将此 Datetime 具有 year 属性过于复杂。您可以从两个日期中取出两年并减去它们以确定年份是否大于 20。learn.microsoft.com/en-us/dotnet/api/......
0赞 KevinLamb 6/5/2019
如果需要,可以向模型本身添加验证。编写验证测试可能会为您节省一些时间?该链接适用于 ASP.NET Core 2.2,但这个概念已经在 MVC ASP.NET 中存在了很长时间。learn.microsoft.com/en-us/aspnet/core/mvc/models/......
0赞 user2083386 6/5/2019
@jake Steffen,谢谢。但是我需要在第二个选项卡(即表单)上执行此逻辑。在按钮上单击此页面中的“下一步”,它只是将当前表单保存在前端,然后转到下一个选项卡,除此之外不执行任何服务器端操作。那么,将我的逻辑放在这里的最佳方法是什么?
0赞 user2083386 6/6/2019
@KevinLamb,感谢您的回复。在本文中,在“自定义属性”下,我可以看到有一个 year 参数被传递到该构造函数中。创建自定义属性类时,如何传递用户输入的动态值?
0赞 KevinLamb 6/6/2019
查看此答案,了解与您的情况类似的内容。只需将窗体绑定到模型属性,即可获取模型中的值。如果您使用的是剃须刀,这里有一个教程

答:

1赞 Jake Steffen 6/5/2019 #1

我认为这可能会有所帮助

获取注册日期的年份:

var enrolledVal = Convert.ToDateTime(model.enrolledValue).Year;

获取当前年份

var current = DateTime.Now.Year;

寻找差异

var result = enrolledVal - current;

评论

0赞 user2083386 6/5/2019
感谢您的回复。但即使是这个逻辑,我是否必须把它放在cshtml文件中,还是必须把它放在提交按钮点击逻辑中?如果提交按钮单击逻辑,则这将再次发生在第 4 个选项卡上。但我需要它出现在第二个选项卡本身中。请不要介意我的问题是否看起来很傻或太基础,我是新手,我还在学习:-)
0赞 Jake Steffen 6/5/2019
我写这篇文章时以为它将在服务器端运行。如果你想在客户端进行验证,你可以尝试如下操作:stackoverflow.com/questions/4537900/...
0赞 user2083386 6/5/2019
再次感谢您的快速回复。你认为是正确的。我希望在我的方案中根据服务器日期验证输入日期。我们已经有了以下检查日期范围的逻辑。[MandatoryField, Display(Name = "Enroller Year"), DataType(DataType.Date), UIHint("Date"), DateRange(MaxDateString = "now", MinOffsetString = "-20Y")] public virtual DateTime? EnrolledYear { get; set; }
0赞 Jake Steffen 6/5/2019
最好控制用户可以输入的内容
0赞 user2083386 6/6/2019
当用户将其系统日期/时间更改为上一年时,会发生此问题。由于应用程序占用了当前浏览器的时间,因此用户可以从 UI 通过。因此,为了限制这一点,我们想使用服务器日期进行验证。但是我们想要显示的消息就在第二个选项卡本身中,而不必等到最后一个选项卡,他单击提交按钮。