2012-10-15 70 views
0

我有一個像這樣的模型,有幾個字段,例如名稱,電子郵件和電話。 所有這些都使用[必需的]屬性進行設置。MVC 3 - RequiredAttribute - 根據會話覆蓋

我想要做的是重寫RequiredAttribute,並且只需要該屬性,如果該網站的當前訪問者不是管理員。所以基本上管理員可以輸入他們喜歡的東西,或者在普通用戶不能的情況下將字段留空。

任何人都可以指向正確的方向或建議實現這個目標的最佳方式嗎?

要了解訪問者是管理員使用:

var permissionId = Helpers.ConvertToInt(Services.UserService.GetCurrentPermissionId().ToString()); 

如果這是0或1,那麼訪問者是不是管理員等等領域應符合規定。

回答

0

我會建議尋找到使用FluentValidation這將允許您指定要複雜得多規則,那麼內置的數據註解允許無需構建自定義屬性。

RuleFor(obj => obj.Email).NotEmpty().Unless(obj => Helpers.ConvertToInt(Services.UserService.GetCurrentPermissionId()) > 1) 
+0

我試過這個,我無法使它工作 – Diginari

+0

我無法得到「除非」的工作,它似乎只能使用模型屬性而不是變量。我通過圍繞If語句包裝RuleFor來實現此目的。 – Diginari

3

你可以寫一個自定義的條件驗證屬性:

public class RequiredIfPermissionIdsAttribute : RequiredAttribute 
{ 
    public int[] PermissionIds { get; private set; } 

    public RequiredIfPermissionIdsAttribute(params int[] permissionIds) 
    { 
     PermissionIds = permissionIds ?? new int[0]; 
    } 

    public override bool IsValid(object value) 
    { 
     int permissionId = Helpers.ConvertToInt(Services.UserService.GetCurrentPermissionId().ToString()); 

     if (PermissionIds.Contains(permissionId)) 
     { 
      return base.IsValid(value); 
     } 

     // the current permission id is not in the list of permission ids 
     // that require validation => we consider the model valid 
     return true; 
    } 
} 

,然後你可以用這個屬性裝飾你的財產:

[RequiredIfPermissionIds(0, 1)] 
public string SomeProperty { get; set; } 

或者代替使用黑名單的方式,你可以使用白名單方法:

public class NotRequiredIfPermissionIdsAttribute : RequiredAttribute 
{ 
    public NotRequiredIfPermissionIdsAttribute(params int[] permissionIds) 
    { 
     PermissionIds = permissionIds ?? new int[0]; 
    } 

    public int[] PermissionIds { get; private set; } 

    public override bool IsValid(object value) 
    { 
     int permissionId = Helpers.ConvertToInt(Services.UserService.GetCurrentPermissionId().ToString()); 

     if (!PermissionIds.Contains(permissionId)) 
     { 
      return base.IsValid(value); 
     } 

     return true; 
    } 
} 

然後:

[NotRequiredIfPermissionIds(2)] 
public string SomeProperty { get; set; } 
+0

如果你想驗證擴展到客戶端,你將還需要重寫GetClientValidationRules和有條件做base.GetClientValidationRules或不取決於:

然後,您可以使用類似這樣的語法解決這個如果有匹配或不匹配。 –

+0

我喜歡這個解決方案,但我也需要它在客戶端工作,任何人都可以告訴我如何覆蓋GetClientValidationRules將工作。我試過這個,但一直遇到問題。 – Diginari

+0

這可能是通過實現'IClientValidatable'接口,但你打算如何調用'Helpers.ConvertToInt(Services.UserService.GetCurrentPermissionId()。ToString());'方法在JavaScript?這當然不可能。您可以使用'[Remote]'屬性在服務器上安全地執行此驗證。這是我絕對不建議你在客戶端實施的東西。 –