Asp.net MVC表单验证相关

时间:2009-05-02 10:55:51

标签: asp.net-mvc

我不知道人们是否已经问过这个问题或者 他们没有看到这个问题或其他什么。

我正在为每个创建视图创建强类型视图。

我通过制作LINQ类实体的部分类来验证服务器端的表单。

添加功能类似

public IEnumerable<RuleViolation> GetRuleViolations()
    {
        if (String.IsNullOrEmpty(Name))
            yield return new RuleViolation("Name is Required", "Name");
        if (String.IsNullOrEmpty(Date.ToString()))
            yield return new RuleViolation("Date is Required", "Date");
        yield break;
    }

我的控制器操作结构如下 alt text
(来源:scottgu.com

问题

如果名称字段长度为Varchar2(10),并且用户输入的名称超出此限制,则product(参见图像)对象的名称将为 Empty 字符串。

更多其他问题与上面的内容相同,如日期如果用户没有输入日期,那么对象的日期也会达到1/1/0001。

总结:我们应该使用这种方法吗?           或者使用方法,比如使用FormColletion或Request.Form获取所有元素......

Cam你给我最好的建议吗?

另见Justin_etheredge's post

2 个答案:

答案 0 :(得分:1)

这个问题有很多潜在的解决方案。

  • 对于字符串:我使用使用反射的验证器从LINQ实体属性的列属性中获取字符串的最大长度并检查这些。或者,如果列被截断,您可以处理插入时发生的错误。

  • 对于日期:您可以对用户必须输入的日期(即必须在某个合理日期之后)或可以自动化的日期进行完整性检查,使用数据库生成的默认值并标记属性在设计器中自动生成并且只读。不要将这些日期放在表单上,​​以便在发布页面时不在实体中设置它们。这适用于“创建日期”等。对于修改日期,执行类似的操作,但是更新触发器生成的值而不是更新时的默认值。

  • 对于布尔值(默认为false):除了对实体本身进行验证外,还验证值提供程序是否具有该字段的尝试值。或者,您可以使列可为空,并检查它是否为空。两者都是妥协,但后者使数据模型适合验证框架,所以我更喜欢前者。

答案 1 :(得分:1)

这是一种做事方式 - 但它几乎打破了MVC模式。您执行检查的方式是基本上允许LINQ和上下文来处理它 - 这就是您遇到问题的原因。理想情况下,您希望在控制器和实际数据之间创建一个层 - 例如服务层(商业智能(BI)层,因为它在商业世界中被调用)。

在该服务层中,您将实施规则 - 例如名称的长度,日期的有效性,允许的内容和不允许的内容。如果那里出现了问题,那么你可以冒出错误并让控制器处理它们。

理想情况下,您希望在控制器和实际逻辑之间创建抽象级别。

我会看看我是否可以很快得到一个例子(此刻有些东西......)