使用正则表达式进行验证

本文关键字:验证 正则表达式 | 更新日期: 2023-09-27 17:58:41

我在ASP.net MVC项目中使用RegularExpression属性时遇到一些问题。

它似乎在客户端工作,当它合适时就会消失,但是在发布操作时,会检查模型状态是否有效,最终发布错误,必须遵循正则表达式。

我试过以下几种:

^[0-9]{1,2}/[0-9]{1,2}/[0-9]{4} [0-9]{1,2}:[0-9]{1,2}$
^'d{1,2}/'d{1,2}/'d{4} 'd{1,2}:'d{1,2}$

本质上,它必须捕捉14/12/2014 14:20作为输入。

有什么想法吗?我迷路了。

型号:

[Required]
[Display(Name = "TimeDisplay", ResourceType = typeof(Resources.Models.Log))]
[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:dd/MM/yyyy HH:mm}")]
[RegularExpression(@"^[0-9]{1,2}/[0-9]{1,2}/[0-9]{4} [0-9]{1,2}:[0-9]{1,2}$")]
public DateTime Time { get; set; }

控制器动作:

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(Log log)
{
    if (ModelState.IsValid)
    {
        db.Logs.Add(log);
        db.SaveChanges();
        TempData["Notification"] = AlertGenerator.GenerateAlert(AlertGenerator.Level.Success, "Success! Log Saved");
        return RedirectToAction("Index");
    }
    return View(log);
}

使用正则表达式进行验证

正如我所知,MVC将使用当前的CultureInfo(服务器上)来解析DateTime格式,因此您不能直接将"dd/MM/yyyy HH:MM"绑定到您的实体。

我的解决方案是创建ViewModel,然后使用DateTime。ParseExact(…)解析日期:

型号:

[Display(Name = "TimeDisplay", ResourceType = typeof(Resources.Models.Log))]
[Required]
[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:dd/MM/yyyy HH:mm}")]
public DateTime Time { get; set; }

ViewModel

[Display(Name = "TimeDisplay", ResourceType = typeof(Resources.Models.Log))]
[Required]
public string Time { get; set; }

控制器

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(LogViewModel logViewModel)
{
    if (ModelState.IsValid)
    {
        // convert from ViewModel to Entity Model
        Log log = new Log(logViewModel);
        // parse the time
        log.Time = DateTime.ParseExact(logViewModel.Time, "dd/MM/yyyy HH:mm", null);
        db.Logs.Add(log);
        db.SaveChanges();
        TempData["Notification"] = AlertGenerator.GenerateAlert(AlertGenerator.Level.Success, "Success! Log Saved");
        return RedirectToAction("Index");
    }
    return View(log);
}