2017-08-24 42 views
0

我使用的是asp.net mvc,我想創建一個自定義驗證屬性來驗證文本輸入引用的StartTimeEndTime將參數傳遞給asp.net中的自定義驗證屬性mvc

我曾嘗試:

型號:

public class MyModel 
{ 
    public bool GoldTime { get; set; } 

    [TimeValidation(@"^\d{1,2}:\d{1,2}$", GoldTime, ErrorMessage = "Start time is invalid.")] 
    public string StartTime { get; set; } 

    [TimeValidation(@"^\d{1,2}:\d{1,2}$", GoldTime, ErrorMessage = "End time is invalid.")] 
    public string EndTime { get; set; } 
} 

驗證屬性:

public class TimeValidationAttribute : ValidationAttribute 
{ 
    private readonly string _pattern; 
    private readonly bool _useGoldTime; 

    public TimeValidationAttribute(string pattern, bool useGoldTime) 
    { 
     _pattern = pattern; 
     _useGoldTime = useGoldTime; 
    } 

    protected override ValidationResult IsValid(object value, ValidationContext validationContext) 
    { 
     if (_useGoldTime) 
     { 
      var regex = new Regex(_pattern); 

      if (!regex.IsMatch(value.ToString())) 
      { 
       return new ValidationResult(ErrorMessage); 
      } 
     } 

     return ValidationResult.Success; 
    } 
} 

但我收到此錯誤信息:

對象引用非靜態字段所需的方法,或 財產「MyModel.GoldTime」

然後,我又通過改變GoldTime(模型)來true嘗試,錯誤信息將消失。

所以,我的問題是:我如何可以傳遞參數GoldTime的屬性構造?我需要使用GoldTime作爲重點,使驗證的StartTimeEndTime值。

謝謝!

+1

您的參數需要是其他屬性的名稱,而不是其他屬性的實際值(並且在您的方法使用反射來獲取其他屬性的值)。我推薦閱讀[ASP.NET MVC 3驗證完整指南 - 第2部分](https://www.devtrends.co.uk/blog/the-complete-guide-to-validation-in-asp.net- MVC -3-部分-2)瞭解如何創建自定義驗證屬性 –

+2

作爲邊注,使用'string'對於這似乎是用於設置日期或時間是不恰當的特性。而你的正則表達式允許'90:80'我認爲也是無效的 –

+0

@StephenMuecke感謝您的鏈接和說明。我正在閱讀文檔。 – Vayne

回答

1

它抱怨使用屬性定義內的模型屬性。相反,在您的自定義屬性中,您可以使用ValidationContext類的屬性來獲取底層模型,我認爲通過validationContext.ObjectInstance

顯然,你不想硬代碼模型的類型,但是你可以使用反射:

bool goldTime; 
var prop = validationContext.ObjectInstance.GetType().GetProperty("GoldTime"); 
if (prop != null) 
    goldTime = (bool)prop.GetValue(validationContext.ObjectInstance, null); 

或者,定義模型的接口:

public interface ITimeModel 
{ 
    bool GoldTime { get; set; } 
} 

而且看爲此:

bool goldTime; 
if (validationContext.ObjectInstance is ITimeModel) 
    goldTime = ((ITimeModel)validationContext.ObjectInstance).GoldTime; 
+0

謝謝!我會嘗試。 – Vayne

相關問題