Asp.net MVC 非字符串验证

问题描述 投票:0回答:2

我最初使用 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 的值不是小数,它将作为 null 传递,而不是“$3,000”或其他值。用户看到的不是“保险 GL 级别必须是数字”消息,而是“值 '$3,000' 对于 Insurance_GLminreq 无效”。我希望该消息更具描述性,以便他们知道为什么它无效,而且我希望他们没有看到实际的字段名称,而是看到与该字段的标签相匹配的名称。

有没有一种相对快速的方法来解决这个问题,而不需要重写验证的完成方式?该网站的这个部分只有 3 个用户,我已经向他们解释过只输入数字。我希望它能正常工作,但在这一点上,对于这个小问题,我不能花很多时间重做它以使用另一种验证方法。

asp.net-mvc linq-to-sql validation asp.net-mvc-2 nerddinner
2个回答
0
投票

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


0
投票

解决此问题的一种方法是更改 MVC 模型:制作

expiration_date
insurance_GLminreq
字符串。

如果您还没有这样做,您需要引入一个可与域模型相互转换的视图模型,因为您确实希望这些值成为

DateTime
decimal
更远的地方。 (请参阅 Steve Michelotti 的 ASP.NET MVC 视图模型模式,以获取有关您的选项的精彩讨论。)

© www.soinside.com 2019 - 2024. All rights reserved.