我最初在 MVC 1.0 中使用 NerdDinner 教程作为基本大纲构建了我的站点。许多早期的设计决策都是简单的 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 的值不是小数,它会作为 null 而不是“$3,000”或其他传递。用户没有看到“Insurance GL Level must be a number”消息,而是看到“价值 '$3,000' 对于 insurance_GLminreq 无效”。我希望消息更具描述性,以便他们知道为什么它无效,我也希望他们没有看到实际的字段名称,而是与字段标签匹配的内容。
有没有一种相对快速的方法来解决这个问题,而不涉及重写验证是如何完成的?该网站的这一部分只有 3 个用户,我已经向他们解释过只输入数字。我希望它能够正常工作,但在这一点上,对于这个小问题,我不能花很多时间重做它以使用另一种验证方法。