Проверка модели не работает с Razor Page и PageModel

У меня есть страница Razor, на которой есть тег для печати сообщения об ошибке, а также печатается состояние ModelState.IsValid.

@page
@model IndexModel

<form asp-page="Index" method="get">
    <input asp-for="Message"/>
    <span asp-validation-for="Message"></span>
    <input type="submit" value="Submit"/>
</form>

<p>ModelState.IsValid = @Model.ModelIsValid</p>

PageModel аннотируется требованием регулярного выражения:

public class IndexModel : PageModel
{
    [FromQuery]
    [RegularExpression("^[A-Za-z]*$")]
    public string Message { get; set; }

    public bool ModelIsValid { get; private set; }

    public void OnGet()
    {
        ModelIsValid = ModelState.IsValid;
    }
}

Однако модель действительна всегда, независимо от того, что я установил Message или не добавляю вообще.

NB Message заполнено правильно.

NB 2 Ни добавление [Required(AllowEmptyStrings = false)], ни замена [FromQuery] на [BindProperty(SupportsGet = true)] не меняют поведения.

Почему мои аннотации неэффективны?

Я опубликовал полный проект здесь: https://1drv.ms/u/s!Au6otEu-6FtC2VFoLNCTDydGUSIR


person BanksySan    schedule 25.11.2018    source источник
comment
Я воспроизвел вашу проблему в .NET Core 2.1 и обнаружил, что ModelState.IsValid возвращает true при первой загрузке, но при отправке не букв, например. 12345 или даже тарабарщины, например $&%*^@ страница ответила следующим сообщением: The field Message must match the regular expression '^[A-Za-z]*$' и ModelState.IsValid возвращает false. Вы уже читали этот выпуск?   -  person Tetsuya Yamamoto    schedule 26.11.2018
comment
Спасибо @TetsuyaYamamoto. Вот в чем проблема! Я добавил .SetCompatibilityVersion(CompatibilityVersion.VersionStartUp1); в StartUp, и теперь все работает. Хотели бы вы добавить его в качестве ответа?   -  person BanksySan    schedule 26.11.2018


Ответы (1)


Чтобы исправить это, нужно изменить

services.AddMvc();

to

services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);

in Startup.cs

Согласно https://github.com/aspnet/Mvc/issues/6790 это позволит вашему приложению включить это поведение.

person Steve    schedule 04.05.2019