2011-03-06 146 views
7

我有一个非常大的60多个问题表单,用户可以开始填写,保存在任何时间点并保留。表单可以从数据库重新加载并随时完成,然后关闭它。ASP.NET MVC 3模型的部分验证

我有以下型号:

public class Questionnaire{ 

    [Required] 
    public string Question1 { get; set; } 

    [Required] 
    [Range(1, 10)] 
    public int Quesiton2 { get; set; } 

    public string Question3 {get;set} 
} 

我需要当用户决定保存表单,当用户选择关闭进行全面验证,包括所需的Fileds的验证,以部分地验证我的模型表格。

实施它的最佳方式是什么?

回答

2

它不是从你的问题/例如完全清楚你需要什么,但我发现普遍认为,分裂的MVC我的视图模型是接近这种事情的最好方法。

将您的实体拆分为部分,,其中每个部分都可以自行验证。

然后使用部分视图/自定义编辑器模板为其中的每个提供UI组件

然后你就可以以一种形式在需要的时候将这些组件,或提供同一页,多页向导,或单页逐行AJAX的向导,或根据需要任何你想要的)在不同的形式。

保持干爽简单。

关键是不要害怕加视图模型需要时,额外的层与UI要求,使您的数据对象行。

不要被你的业务对象/实体的约束,当你特别需要自由人 - 它很容易把业务对象的部分重新走到一起从构成视图模型件。

0

你可以有两个不同的操作保存(),并提交()和禁用验证(或做最小的验证)上保存()。

+0

这是我脑子里想的,在保存()动作我会用ModelState.IsValid但我应该如何实现提交()动作验证?我想除[必需的]属性之外的所有属性在非空字段上进行验证 – Marc 2011-03-06 14:56:44

1

你为什么要使用问题1 .. Questionn ..每题1名对象,如果添加什么新问题?...你应该有一个问题清单,然后验证手动之前保存acording到您的业务规则。

0

从巴拉的r想法继,这将是最好根据您正在执行,保存或提交该行动执行条件的验证。 由此我的意思是,在保存时,只验证字段中的数据,因此检查nulls/empties/defaults并且不验证这些字段,但根据业务逻辑/模型规则验证这些字段是否已经进入。

因此,假设你有一个名字,年龄和性别的表单,对于尝试1,用户填写他们的名字为'1234',年龄为'12'并且留下'性别'为空,当你保存时,你需要遍历每个控件并验证具有值的值,在这种情况下,名称和年龄,然后您可以验证名称并报告'1234'不是有效名称,但接受年龄为12。

你可能会更好地放置在这个服务器端,就好像你试图验证这个客户端一样,很难区分必填字段和空白字符之间的区别,这一直是空白的句号。 (你可能会争辩说,你需要一个客户端的Save()和Submit()验证函数来绕过这个以及服务器端)。