CustomValidator для проверки нескольких форматов даты - PullRequest
0 голосов
/ 11 июня 2019

Я использую поле CustomValidator в веб-форме Asp.net для проверки поля даты. Как я могу проверить несколько форматов даты? Например, это будет действительно: 01/05/2019, и это будет действительно: 01/05/2019, и это будет действительно: 2019/05/01. Вот код, который не работает при попытке проверить все три типа даты, но работает при использовании только одного формата даты:

protected void CustomValidator1_ServerValidate(object source, ServerValidateEventArgs args)
{
    //Issue Date
    if (Regex.IsMatch(txtIssueDate.Text, "(((0|1)[0-9]|2[0-9]|3[0-1])\\/(0[1-9]|1[0-2])\\/((19|20)\\d\\d))$"))
    {
        DateTime dt;
        args.IsValid = DateTime.TryParseExact(args.Value, "dd/MM/yyyy", new CultureInfo("en-GB"), DateTimeStyles.None, out dt);
        args.IsValid = DateTime.TryParseExact(args.Value, "d/MM/yyyy", new CultureInfo("en-GB"), DateTimeStyles.None, out dt);
        args.IsValid = DateTime.TryParseExact(args.Value, "yyyy/MM/dd", new CultureInfo("en-GB"), DateTimeStyles.None, out dt);
        if (args.IsValid)
        {
            args.IsValid = true;
        }
    }
    else
    {
        args.IsValid = false;
        ScriptManager.RegisterStartupScript(UpdatePanel2, UpdatePanel2.GetType(), "myFunction", "alertInvalidDate();", true);
    }
}

EDIT Я воспользовался советом Сача и воспользовался этим методом для проверки полей даты - полностью забыв пользовательский валидатор:

var formats = new string[] { "dd/MM/yyyy", "d/MM/yyyy", "yyyy/MM/dd" };            

var isValidFormat = DateTime.TryParseExact(txtIssueDate.Text, formats, CultureInfo.CurrentCulture, DateTimeStyles.None, out DateTime res1);
if (isValidFormat)
{
    //It's all good.
}
else
{
    ScriptManager.RegisterStartupScript(UpdatePanel2, UpdatePanel2.GetType(), "myFunction", "alertInvalidDate();", true);
}

Ответы [ 2 ]

1 голос
/ 11 июня 2019

Ваш код не работает, потому что он учитывает результат last TryParseExact строки ONLY :

args.IsValid = DateTime.TryParseExact(args.Value, "yyyy/MM/dd", new CultureInfo("en-GB"), DateTimeStyles.None, out dt);

Предыдущие результаты потеряны.

Кроме того, эта часть совершенно бессмысленна ( Я надеюсь, вы понимаете, почему ):

if (args.IsValid)
{
    args.IsValid = true;
}

Попробуйтеэто вместо:

if (Regex.IsMatch(txtIssueDate.Text, "(((0|1)[0-9]|2[0-9]|3[0-1])\\/(0[1-9]|1[0-2])\\/((19|20)\\d\\d))$"))
{
        DateTime dt;
        args.IsValid = (DateTime.TryParseExact(args.Value, 
                            "dd/MM/yyyy", 
                            new CultureInfo("en-GB"), 
                            DateTimeStyles.None, 
                            out dt) || 
                        DateTime.TryParseExact(args.Value, 
                            "d/MM/yyyy", 
                            new CultureInfo("en-GB"), 
                            DateTimeStyles.None, 
                            out dt) ||
                        DateTime.TryParseExact(args.Value, 
                            "yyyy/MM/dd", 
                            new CultureInfo("en-GB"), 
                            DateTimeStyles.None, 
                            out dt));
}
else
{
    args.IsValid = false;
    ScriptManager.RegisterStartupScript(UpdatePanel2, UpdatePanel2.GetType(), "myFunction", "alertInvalidDate();", true);
}
1 голос
/ 11 июня 2019

Вы просто хотите использовать TryParseExact() с несколькими форматами.

static void Main()
{
    var formats = new string[] { "dd/MM/yyyy", "d/MM/yyyy", "yyyy/MM/dd" };

    DateTime.TryParseExact("01/05/2019", formats, CultureInfo.CurrentCulture, DateTimeStyles.None, out DateTime res1);
    Console.WriteLine(res1.ToLongDateString());
    DateTime.TryParseExact("1/05/2019", formats, CultureInfo.CurrentCulture, DateTimeStyles.None, out DateTime res2);
    Console.WriteLine(res2.ToLongDateString());
    DateTime.TryParseExact("2019/05/01", formats, CultureInfo.CurrentCulture, DateTimeStyles.None, out DateTime res3);
    Console.WriteLine(res3.ToLongDateString());
    Console.ReadLine();
}

Вывод:

Среда, 01 мая 2019

Среда, май01, 2019

Среда, 01 мая 2019

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...