繁体   English   中英

Asp.net MVC验证非字符串

[英]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_dateinsurance_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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM