2

我最初在 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 个用户,我已经向他们解释过只输入数字。我希望它能够正常工作,但在这一点上,对于这个小问题,我不能花很多时间重做它以使用另一种验证方法。

4

2 回答 2

0

解决此问题的一种方法是更改​​您的 MVC 模型:makeexpiration_dateinsurance_GLminreqstrings。

如果您还没有这样做,则需要引入一个可与您的域模型相互转换的视图模型,因为您确实希望这些值是 aDateTime和 a decimal。(请参阅 Steve Michelotti 的ASP.NET MVC 视图模型模式,以获得对您的选项的精彩讨论。)

于 2010-07-02T15:48:54.943 回答
0

通过使用 jquery 验证插件快速解决这个问题。 http://bassistance.de/jquery-plugins/jquery-plugin-validation/

于 2010-09-04T18:28:01.890 回答