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

Posted

技术标签:

【中文标题】需要使用 MVC 中的表单验证从服务器端验证 DateTime【英文标题】:Need to validate the DateTime from server side using form validation in MVC 【发布时间】:2019-10-21 03:19:53 【问题描述】:

我有一个客户端验证,它限制用户只能在 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);

【问题讨论】:

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

我认为这可能会有所帮助

获取注册日期的年份:

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

获取当前年份

var current = DateTime.Now.Year;

找不同

var result = enrolledVal - current;

【讨论】:

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

以上是关于需要使用 MVC 中的表单验证从服务器端验证 DateTime的主要内容,如果未能解决你的问题,请参考以下文章

ASP.Net MVC 3客户端验证,带有3个选项卡表单

服务器端验证

让 MVC 4 验证 jquery 手风琴表单的所有部分

asp.net mvc 3 - ajax 表单提交和验证

使用 DTO 和哈希映射的 Java 服务器端表单验证

.NET Core MVC 中的表单验证