我有一個視圖模型,這是在這個模型中3到4個視圖的常見我也定義驗證規則。現在的問題是,在其中一個視圖我想覆蓋視圖模型驗證規則爲兩到三個領域,我做了什麼?我不想爲這種觀點制定新的觀點模型。驗證規則在mvc 3.0
回答
我的建議基本上是你不想要的:創建新的模型類,但使用繼承來避免重複你想要的屬性。如果您堅決反對創建單獨的模型,您可能會考慮實施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所緩解的任何感知技術債務都會有所改變;模型易於維護。
有三個選項,我能想到的:
- 使用AutoMapper來處理一些繁重的工作做一個獨立的視圖模型。
- 使子類具有不同的驗證規則。
- 製作自定義
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;
}
}
但我想覆蓋一些字段而不是所有的驗證.. –
正確的,你會使用'[CustomRequired]'而不是'[必需的]'''''''''''''''''''''' –
從MVC架構的角度來看 - 這是正是爲什麼要使用視圖模型 你應該爲每個個案創建單獨的視圖模型。使用automapper(可在codeplex上免費獲取)在視圖模型和實體之間複製值。
甚至不考慮一種不同的方式,繼承等 - 這是ViewModels的用途。
爲了我自己的利益,你爲什麼會阻礙繼承? – egoodberry
+1不推薦你自己不會做的事。像我一樣。大聲笑 –
+1 for *'甚至不考慮一種不同的方式* :-)我喜歡這個結論。 –
如果您繼續前進並使用繼承,那麼請確保您從抽象類繼承。我認爲隨着系統的發展,你很可能會遇到一個場景,你的抽象類將不得不被大量修改,因此如果我是你,我會創建更多的視圖模型,即使代碼看起來是重複的。從長遠來看,你會受益匪淺,因爲你可以用盡可能少的副作用來修改應用程序的某些部分。
- 1. MVC Dataannotation驗證規則的集合?
- 2. ASP.Net MVC 3.0遠程驗證
- 3. 規則驗證color_id
- 4. Jquery - 驗證 - 規則
- 5. CodeIgniter驗證規則
- 6. Laravel驗證規則
- 7. Combobox驗證規則
- 8. yii驗證規則
- 9. iptables規則驗證
- 10. JQuery驗證的遠程驗證規則失敗(使用MVC 2)
- 11. 驗證規則無法正確更新2驗證規則
- 12. 驗證與規則(JQuery驗證)
- 13. jquery驗證:自定義驗證規則
- 14. ASP.NET MVC模型驗證打破了MVC規則?
- 15. 在cakephp中創建驗證規則,它可以用作核心驗證規則
- 16. Kohana的驗證規則(該規則或該規則)
- 17. IDataErrorInfo WPF驗證規則/組
- 18. ISNUMBER()數字驗證規則
- 19. Jquery驗證插件規則()
- 20. jquery驗證規則包含
- 21. Laravel 5驗證規則required_with:password_confirmation
- 22. Externalise驗證規則JSF
- 23. Yii數組驗證規則
- 24. 轉義Laravel驗證規則
- 25. 結果驗證規則
- 26. jQuery驗證忽略規則
- 27. Codeigniter驗證規則幫助
- 28. 重用laravel驗證規則
- 29. jQuery驗證值規則
- 30. 驗證規則不工作
我不明白,你可以解釋我或給出任何例子,如果你有。 –
爲了談話/教育的目的添加了示例。 – egoodberry