2011-10-21 72 views
2

我得到了2個DateTime字段,我使用datepicker爲用戶選擇日期。但是,由於它是一個文本框,用戶仍然可以輸入任何值並單擊提交按鈕。所以,我希望對DateTime文本字段進行驗證,以檢查提交的值是否爲具有特定格式的DateTime。我嘗試這樣做:MVC 3 - 驗證「isDateTime」不起作用

[Required(ErrorMessage = "Storage Date is required")] 
[DataType(DataType.DateTime, ErrorMessage = "Please input a valid date")] 
public DateTime StorageDate { get; set; } 

不過,我不力在文本框中得到任何消息,即使我輸入「XXXXX」,並提交(注:[必填]審定做的工作)

我的形式是這樣的:

<div class="editor-label"> 
    Storage Date 
</div> 
<div class="editor-field"> 
    @Html.TextBox("StorageDate", String.Format("{0:ddd, d MMM yyyy}", DateTime.Now), new { id = "storagedate" }) 
    @Html.ValidationMessageFor(model => model.StorageDate) 
</div> 

所以,我需要檢查日期根據格式也..任何想法,爲什麼它不工作?

任何幫助,非常感謝......感謝......

回答

1

你可以添加一個正則表達式註釋到您的視圖模型的財產:

[RegularExpression("Expression_goes_here", "Date is of invalid format.")] 

Here is a link for a REGEX library - you may choose to use one of their expressions for validating date.

+0

嗨,謝謝!一個簡單的解決方案,我這樣做: [RegularExpression(@「^((((((0?[13578])|(1 [02]))[\。\ - /]?((0? [1-9])|([12] \ d)|(3 [01])))|(((0 [469])|(11))[\ \ - /]((0≦φ≦ [1-9])|([12] \ d)|(30)))|((O 2)[\ \ - /]((0 [1-9])|???(1 \ d )|(2 [0-8]))))[\ \ - /。](((19)|(20))([\ d] [\ d]))))|((0≦φ≦ ?2)[\ \ - /](29)[\ \ - /。](((19)|?(20))(([02468] [048])|([13579] [26]) ))))$「,ErrorMessage =」請輸入有效日期「)] 它是正確的嗎? – shennyL

+0

如果你的REGEX是正確的,那麼是的 - 這將工作。如果您有更多具有DateTime類型屬性的查看模型,那麼我會建議使用counsellorben的解決方案,因爲它可以提高可重用性。 – 2011-10-22 13:51:12

+0

嗨,我找不到任何正則表達式格式爲2011年10月31日星期一(日期選擇器格式:'D,dd M yy')。任何想法??或者我實際上可以禁用文本字段,以確保用戶只從datepicker選擇日期? – shennyL

1

爲了驗證在文本框中的值是一個有效的日期,你需要添加一個RegularExpressionAttribute與日期格式的正則表達式。我使用自定義屬性,用正則表達式來驗證字符串格式爲mm/dd/yyyy。

public class DateAttribute : ValidationAttribute, IClientValidatable 
{ 
    public DateAttribute() 
    { 
     ErrorMessage = "{0} is not a valid date"; 
    } 

    private string _pattern = "^(((0?[1-9]|1[012])/(0?[1-9]|1\\d|2[0-8])|(0?[13456789]|1[012])/(29|30)|(0?[13578]|1[02])/31)/(19|[2-9]\\d)\\d{2}|0?2/29/((19|[2-9]\\d)(0[48]|[2468][048]|[13579][26])|(([2468][048]|[3579][26])00)))$"; 

    private string _fieldLabel; 
    public string FieldLabel 
    { 
     get { return _fieldLabel; } 
     set { _fieldLabel = value; } 
    } 

    public override string FormatErrorMessage(string name) 
    { 
     return String.Format(ErrorMessageString, name); 
    } 

    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context) 
    { 
     var rule = new ModelClientValidationRule 
     { 
      ErrorMessage = FormatErrorMessage(_fieldLabel), 
      ValidationType = "regex", 
     }; 
     rule.ValidationParameters.Add("pattern", _pattern); 
     yield return rule; 
    } 

    protected override ValidationResult IsValid(object value, ValidationContext validationContext) 
    { 
     if (String.IsNullOrEmpty(value.ToString())) 
      return null; 
     Regex regex = new Regex(_pattern); 
     if (regex.IsMatch(value.ToString())) 
      return null; 

     return new ValidationResult(
      FormatErrorMessage(_fieldLabel) 
     ); 
    } 
} 

裝飾用[日期]的財產,你設置。

+0

您好,我嘗試過這種方法,但我在的IEnumerable得到編譯錯誤 shennyL

+0

待辦事項你有'使用System.Web.Mvc;'在你的類文件中? – counsellorben

+0

是啊..我不知道爲什麼我不斷收到錯誤 – shennyL