所以为了解决这个问题,这就是我使用的
在后端
#region Properties
[Required]
[BindProperty]
[RegularExpression("^(?:[01]?[0-9]|2[0-3]):[0-5][0-9]$", ErrorMessage = "Insira uma hora no formato HH:MM")]
public string Inicio { get; set; }
[Required]
[BindProperty]
[RegularExpression("^(?:[01]?[0-9]|2[0-3]):[0-5][0-9]$", ErrorMessage = "Insira uma hora no formato HH:MM")]
public string Fim { get; set; }
[BindProperty]
public Horario Horario { get; set; }
#endregion
#region Handlers
public void OnGet()
{
}
public async Task<IActionResult> OnPost()
{
TimeSpan inicio;
if (!TimeSpan.TryParse(Inicio, out inicio))
{
ModelState.AddModelError("", "Hora de Início inválida.");
}
TimeSpan fim;
if (!TimeSpan.TryParse(Fim, out fim))
{
ModelState.AddModelError("", "Hora de Fim inválida.");
}
if (!ModelState.IsValid)
{
_toastNotification.AddErrorToastMessage("Dados inválidos.");
return Page();
}
Horario.Inicio = inicio;
Horario.Fim = fim;
_horarioService.Add(Horario);
try
{
await _horarioService.SaveChangesAsync();
}
catch(DbUpdateException e)
{
//This either returns an error string, or null if it can’t handle that error
var error = e;
if (error != null)
{
// Log Error and notify user
_logger.LogError($@"Falha ao criar Horário para o UAP {Horario.Uap}\n Erro: {e.InnerException}");
ModelState.AddModelError(string.Empty, $"O horário {Horario.Inicio}-{Horario.Fim} {Horario.Uap} já existe.");
_toastNotification.AddWarningToastMessage($"O horário {Horario.Inicio}-{Horario.Fim} {Horario.Uap} já existe.");
return Page(); //return the error string
}
throw; //couldn’t handle that error, so rethrow
}
// Notify user action was successful and log information
_toastNotification.AddSuccessToastMessage("Horário adicionado.");
_logger.LogInformation($@"Adicionado Horário {Horario.Inicio}-{Horario.Fim} {Horario.Uap}. Data: {DateTime.Now.ToString("dd-MM-yyyy hh:mm")}");
return RedirectToPage("Index");
}
#endregion
在前端
<div class="card card-body">
<div class="form-group col-3">
<div class="input-group mb-3">
<div class="input-group-prepend date">
<span class="input-group-text" id="basic-addon1"><i class="fa fa-clock"></i></span>
</div>
<input type="text" class="form-control" id='Inicio' asp-for="Inicio" />
</div>
<span asp-validation-for="Inicio" class="text-danger"></span>
</div>
<div class="form-group col-3">
<div class="input-group mb-3">
<div class="input-group-prepend date">
<span class="input-group-text" id="basic-addon1"><i class="fa fa-clock"></i></span>
</div>
<input type="text" class="form-control" id='Fim' asp-for="Fim" />
</div>
<span asp-validation-for="Fim" class="text-danger"></span>
</div>
</div>
我正在使用引导日期时间选择器
@section Scripts{
@{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
<script src="~/lib/moment.js/moment.js"></script>
<script src="~/lib/bootstrap-datetimepicker/js/bootstrap-datetimepicker.min.js"></script>
<script src="~/lib/limonte-sweetalert2/sweetalert2.all.js"></script>
<script>
function OnSubmit() {
$form = $('#form');
if ($form.valid()) {
$(".submit-overlay").fadeIn();
$form.find(':submit').attr('disabled', true).html('<span class="spinner-grow spinner-grow-sm" role="status" aria-hidden="true"></span> A processar...');
}
}
$(function () {
$('#Inicio').datetimepicker({
icons: {
time: "fa fa-clock-o",
date: "fa fa-calendar",
up: "fa fa-arrow-up",
down: "fa fa-arrow-down",
next: "fa fa-arrow-right",
previous: "fa fa-arrow-left",
},
format: 'HH:mm'
});
$('#Fim').datetimepicker({
icons: {
time: "fa fa-clock-o",
date: "fa fa-calendar",
up: "fa fa-arrow-up",
down: "fa fa-arrow-down",
next: "fa fa-arrow-right",
previous: "fa fa-arrow-left",
},
format: 'HH:mm'
});
});
</script>
这解决了浏览器的验证和任何文化问题,并为用户提供了体面的 UI。