【发布时间】: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。
标签: c# jquery .net validation server-side