[英]Asp.net MVC validation for non-strings
我最初使用NerdDinner教程作为基本概述在MVC 1.0中构建了我的网站。 许多早期的设计决策都是简单地由b / c做出的,“ NerdDinner就是这样做的。”从那时起,它确实发展了起来,并转换为2.0。
我的验证仍然按照NerdDinner的方式进行,并且非常少,因此,尽管我已经了解了其他方式,但从来没有任何理由更改它。
我最近添加了一些十进制类型的新字段。 发布后,用户尝试输入值“ $ 3000”和“ 3,000”,并得到基本的“无效”错误。 我向他解释说他只能在该字段中输入数字。 我进行了验证,并为该字段添加了更好的验证,以便将来他们可以得到更具描述性的信息。 但是,该字段的值作为null传递给我的验证例程。 如果输入了有效的小数,则将其传递到验证例程。 我也已经对我的日期字段进行了验证,并意识到它们正在发生同样的事情。 我所有的其他验证都是字符串,并且验证是在检查诸如字符之类的不允许的东西,并且效果很好。 但是,在那种情况下,它实际上并不是在检查数据库是否认为无效的内容。
这是我的验证示例:
public IEnumerable<RuleViolation> GetRuleViolations()
{
if (String.IsNullOrEmpty(subcontract_no.Trim()))
yield return new RuleViolation("Subcontract Number is required", "subcontract_no");
if (db.subcontracts.Count(s => (s.subcontract_no == subcontract_no) && (s.subcontract_id != subcontract_id)) > 0)
yield return new RuleViolation("Subcontract Number already exists", "subcontract_no");
if (subcontract_no.Contains("/")) // quick fix, needs better validation
yield return new RuleViolation("Subcontract Number cannot contain /", "subcontract_no");
if (!isValidDate(expiration_date.ToString()))
yield return new RuleViolation("Expiration Date is not valid", "expiration_date");
if (!isValidDecimal(insurance_GLminreq.ToString()))
yield return new RuleViolation("Insurance GL Level must be a number", "insurance_GLminreq");
“ isValidDate”和“ isValidDecimal”例程按我预期的那样工作,问题是,如果insurance_GLminreq的值不是小数,它将作为空值而不是“ $ 3,000”或其他值传递。 而不是用户看到“ Insurance GL Level必须是一个数字”消息,而是看到“值'$ 3,000'对于insurance_GLminreq无效”。 我希望该消息更具描述性,以便他们知道为什么该消息无效,也希望他们没有看到实际的字段名称,而是看到与该字段的标签匹配的内容。
是否有相对快速的方法来解决此问题,而无需重写验证的完成方式? 该站点的这一部分只有3个用户,我已经向他们解释了仅输入数字。 我希望它能够正常工作,但是就这一点以及这个小问题而言,我不能花很多时间来重做它以使用另一种验证方法。
解决此问题的一种方法是更改您的MVC模型:制作expiration_date
和insurance_GLminreq
字符串。
如果您尚未这样做,则需要引入一个可与您的域模型进行相互转换的视图模型,因为您确实希望这些值是DateTime
和行后的decimal
。 (有关选项的出色讨论,请参见Steve Michelotti的ASP.NET MVC视图模型模式 。)
使用jquery验证插件快速解决这个问题。 http://bassistance.de/jquery-plugins/jquery-plugin-validation/
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.