2012-01-15 63 views
0

考虑以下代码:当我进入这个值正则表达式停止崩溃

[Required] 
[RegularExpression(@"\d{2,2}/\d{2,2}/\d{4,4} \d{2,2}:\d{2,2}:\d{2,2}", 
ErrorMessage = "Wrong Syntax Entered, Needed:day/Month/Year Hour:Minutes:Seconds")] 
public DateTime Posted { get; set; } 

,我的应用程序崩溃:00/00/0000 00:00:00

有没有办法阻止这一点,使之更切合实际?我想允许日期,所以它只允许最多31天或更少的1,并允许最多12个月和1分钟?

+0

[Regular Expression Date and Time]的可能重复(http://stackoverflow.com/questions/8865323/regular-expression-date-and-time) – 2012-01-15 01:48:18

+0

不一样这是崩溃 – user1137472 2012-01-15 02:10:45

+0

当你说“崩溃” ,你的意思是抛出一个未捕获的异常?对? – 2012-01-15 03:06:34

回答

2

正则表达式是验证日期和时间的错误方法。改为使用DateTime.TryParse

编辑:

下面是一个例子:

using System; 
using System.Globalization; 

... 

bool valid; 
DateTime dt; 
valid = DateTime.TryParseExact(inputString, "dd/MM/yyyy HH:mm:ss", CultureInfo.InvariantCulture, DateTimeStyles.None, out dt); 
+0

+1 - 我宁愿任何一天在RegEx上使用TryParse。 :) – 2012-01-15 01:55:47

+0

你可以举个例子吗?或者我可以修改我的当前表达式,以便它停止00/00/00 00:00:00并允许最多31和最少1,以及几天和几个月最小1和最多12 – user1137472 2012-01-15 02:12:29

+0

@ user1137472 :我已经添加了一个例子。 – MRAB 2012-01-15 02:31:27

0

我同意@MRAB认为的TryParse可能更易于管理和维护。

SO question也试图做你在做什么,他们创造了一个自定义属性(来自RegularExpressionAttribute)似乎已经解决了他的问题。也许它会帮助你。

希望这会有所帮助。

0

用正则表达式验证DATATIME会导致复杂的正则表达式像

^([0][1-9]||[1-2][0-9]||[3][0-1])/([0][1-9]||[1][1-2])/([1][0-9]{3}) ([0][1-9]||[1][0-2]):([0][1-9]||[1-5][0-9]):([0][1-9]||[1-5][0-9])$ 

但我仍然怀疑它可能会错过一些边缘情况。

如果您正在使用MVC3,然后使用自验证模型像如下的最佳方式,

public class TestModel:IValidatableObject 
    { 
     string MyDateTime{get;set;} 

     public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) 
     { 
      List<ValidationResult> v = new List<ValidationResult>(); 
      DateTime dt = default(DateTime); 
      DateTime.TryParseExact(MyDateTime, "dd/MM/yyyy HH:mm:ss", CultureInfo.InvariantCulture,DateTimeStyles.None,out dt); 
      if (dt.Equals(default(DateTime))) 
       v.Add(new ValidationResult("Invalid Date time")); 
      return v; 
     } 
    } 
+0

如果我要实现这一点,它将是一个部分课程? – user1137472 2012-01-15 15:12:31

0

另一个,在ModelBinder的改变出现FormatException消息(但要远...)。

DefaultModelBinder.GetValueInvalidResource是静态method.I不能重写此方法。因为我创建CustomModelBinder类并重写SetProperty方法。

[Required] 
[AdditionalMetadata(
"PropertyValueInvalid", 
"Wrong Syntax Entered, Needed:day/Month/Year Hour:Minutes:Seconds")] 
public DateTime? Posted { get; set; } 

并创建自定义ModelBinder的

public class CustomModelBinder : DefaultModelBinder 
{ 
    protected override void SetProperty(ControllerContext controllerContext, ModelBindingContext bindingContext, System.ComponentModel.PropertyDescriptor propertyDescriptor, object value) 
    { 
     base.SetProperty(controllerContext, bindingContext, propertyDescriptor, value); 

     var propertyMetadata = bindingContext.PropertyMetadata[propertyDescriptor.Name]; 
     var invalidMessage = propertyMetadata.AdditionalValues.ContainsKey("PropertyValueInvalid") 
           ? (string)propertyMetadata.AdditionalValues["PropertyValueInvalid"] 
           : string.Empty; 
     if (string.IsNullOrEmpty(invalidMessage)) 
     { 
      return; 
     } 

     // code from DefaultModelBinder 
     string fullPropertyKey = CreateSubPropertyName(bindingContext.ModelName, propertyDescriptor.Name); 
     if (!bindingContext.ValueProvider.ContainsPrefix(fullPropertyKey)) 
     { 
      return; 
     } 
     ModelState modelState = bindingContext.ModelState[fullPropertyKey]; 
     foreach (ModelError error in modelState.Errors.Where(err => String.IsNullOrEmpty(err.ErrorMessage) && err.Exception != null).ToList()) 
     { 
      for (Exception exception = error.Exception; exception != null; exception = exception.InnerException) 
      { 
       if (exception is FormatException) 
       { 
        string displayName = propertyMetadata.GetDisplayName(); 
        string errorMessageTemplate = invalidMessage; 
        string errorMessage = String.Format(CultureInfo.CurrentCulture, errorMessageTemplate, 
                 modelState.Value.AttemptedValue, displayName); 
        modelState.Errors.Remove(error); 
        modelState.Errors.Add(errorMessage); 
        break; 
       } 
      } 
     } 
    } 
} 

这个怎么样?

+0

我不知道你写了什么,人们说regx是坏的?看看那些代码,你永远无法理解它的功能。我只想要一个regx不使用服务器端验证只是想要一个日期和时间表达我了解你的专业人士,但给我这个代码就像给宝宝一把枪 – user1137472 2012-01-15 15:20:49