2011-03-06 148 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()驗證函數來繞過這個以及服務器端)。