2009-05-02 121 views
1

我不知道人们是否已经问过这个问题或者 他们没有看到这个问题或者其他什么。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 http://www.scottgu.com/blogposts/mvcpreview5/step15.png

问题

如果Name字段长度为VARCHAR2(10),以及用户输入超过名称这个限制然后产品(见图片)对象将有名字为字符串。

更超过其它问题同上像日期如果用户没有输入日期,然后也对象将有日期像1/1/0001。

摘要:我们应该使用这种方法吗? 或使用方法像通过使用FormColletion或Request.Form获取所有元素...

凸轮你给我最好的建议呢?

另见Justin_etheredge's post

回答

1

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

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

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

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

1

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

在那个服务层是你要实现规则的地方 - 比如名字的长度,日期的有效性,什么是和不允许。如果在那里有什么问题,那么你可以冒出错误并让控制器处理它们。

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

我会看到,如果我能得到一个例子了不久(有什么地方拿出的那一刻...)

+0

,如果我们不使用LINQtoSQL类,那么什么MS实体框架? 我不知道这个问题在MS EF ...让我检查这 – Vikas 2009-05-02 12:59:16