2011-10-10 80 views
3

我有一個視圖模型,這是在這個模型中3到4個視圖的常見我也定義驗證規則。現在的問題是,在其中一個視圖我想覆蓋視圖模型驗證規則爲兩到三個領域,我做了什麼?我不想爲這種觀點制定新的觀點模型。驗證規則在mvc 3.0

回答

1

我的建議基本上是你不想要的:創建新的模型類,但使用繼承來避免重複你想要的屬性。如果您堅決反對創建單獨的模型,您可能會考慮實施IValidatableObject,並在驗證您希望改變的屬性之前檢查其他屬性。

編輯: 我不Tuliper的答案不同意,而是要充實我的建議,考慮在其中要保存用戶數據的情況。從一種形式,你正在創建一個用戶;從另一個角度來說,你只是簡單地更新(這是有點延伸,但它只是爲了說明)。 「創建」表單可能需要引用用戶的人的姓名,而「更新」表單可能不需要。

使用繼承,你可以做到以下幾點:

public class SaveUserModel 
{ 
    public int? UserId { get; set; } 

    ... 
} 

public class CreateUserModel : SaveUserModel 
{ 
    [Required] 
    public string ReferredByName { get; set; } 
} 

使用IValidatableObject,你可以這樣來做:

public class SaveUserModel : IValidatableObject 
{ 
    public int? UserId { get; set; } 

    public string ReferredByName { get; set; } 

    ... 

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) 
    { 
     // if UserId is null, we are creating a user vs. updating 
     if (UserId != null && string.IsNullOrWhiteSpace(ReferredBySiteUrl)) 
      yield return new ValidationResult("Please specify the name of the person who referred you.", new[] { "ReferredByName" }); 
    } 
} 

要重申,我不是把我的答案。如果模型在不同視圖中完全相同,我傾向於重複使用模型,但通常有足夠的差異來保證簡單地創建單獨的模型。最終,在這種情況下堅持DRY所緩解的任何感知技術債務都會有所改變;模型易於維護。

+0

我不明白,你可以解釋我或給出任何例子,如果你有。 –

+0

爲了談話/教育的目的添加了示例。 – egoodberry

1

有三個選項,我能想到的:

  1. 使用AutoMapper來處理一些繁重的工作做一個獨立的視圖模型。
  2. 使子類具有不同的驗證規則。
  3. 製作自定義ValidationAttribute其是上下文敏感的(無論是通過重寫IsValid(Object, ValidationContext)方法,或依賴從靜態方法/屬性的其他上下文信息。

例如,如果該請求來到這需要驗證屬性將被忽略從某個網址:

public class CustomRequiredAttribute : RequiredAttribute 
{ 
    public override bool IsValid(object value) 
    { 
     if (HttpContext.Current.Request.Url != "urlwhennotrequired") 
      return base.IsValid(value); 
     return true; 
    } 
} 
+0

但我想覆蓋一些字段而不是所有的驗證.. –

+0

正確的,你會使用'[CustomRequired]'而不是'[必需的]'''''''''''''''''''''' –

3

從MVC架構的角度來看 - 這是正是爲什麼要使用視圖模型 你應該爲每個個案創建單獨的視圖模型。使用automapper(可在codeplex上免費獲取)在視圖模型和實體之間複製值。

甚至不考慮一種不同的方式,繼承等 - 這是ViewModels的用途。

+0

爲了我自己的利益,你爲什麼會阻礙繼承? – egoodberry

+0

+1不推薦你自己不會做的事。像我一樣。大聲笑 –

+0

+1 for *'甚至不考慮一種不同的方式* :-)我喜歡這個結論。 –

1

如果您繼續前進並使用繼承,那麼請確保您從抽象類繼承。我認爲隨着系統的發展,你很可能會遇到一個場景,你的抽象類將不得不被大量修改,因此如果我是你,我會創建更多的視圖模型,即使代碼看起來是重複的。從長遠來看,你會受益匪淺,因爲你可以用盡可能少的副作用來修改應用程序的某些部分。