Обязательный строковый атрибут со значением NULL дает IsValid=true в ASP.NET Core 2 Razor Page

Я действительно смущен этим. У меня есть страница Razor на ASP.NET Core 2, которая имеет обязательное свойство под названием SchemaId, Я пытался пометить его как [Required], [BindRequired], а также [Required(AllowEmptyStrings = false)]Тем не менее, когда я публикую свою форму, я вижу, что SchemaId является null и все еще ModelState.IsValid == true, Вот Upload.cshtml.cs:

namespace Uploader.Pages
{
    public class UploadModel : PageModel
    {
        private IUploader _uploader;

        public UploadModel(IUploader uploader)
        {
            _uploader = uploader;
        }

        [BindProperty]
        public IEnumerable<IFormFile> UploadedFiles { get; set; }

        [Required(AllowEmptyStrings = false)]
        [BindProperty]
        [BindRequired]
        public string SchemaId { get; set; }


        public void OnGet(string schemaId = null)
        {
            SchemaId = schemaId;
        }

        public async Task<IActionResult> OnPostAsync()
        {
            // SchemaId is NULL right here!
            if (!ModelState.IsValid) // Yet IsValid = true!
            {
                return Page();
            }

            // Use _uploader to actually upload the file

            return RedirectToPage("/Next", new { uploadId = uploadId, schemaId = SchemaId });
        }
    }
}

Соответствующая выписка из Upload.cshtml файл:

<div asp-validation-summary="All"></div>
<form enctype="multipart/form-data" method="POST" asp-page="Upload">
    <input class="inputfile" type="file" id="UploadedFiles" multiple="multiple" name="UploadedFiles">
    <label for="UploadedFiles">
        <span>Choose a file...</span>
    </label>
    <input type="hidden" asp-for="SchemaId">
    <button type="submit" class="inputfilesubmit">Upload</button>
</form>

Как я могу заставить проверку модели работать должным образом?

1 ответ

Решение

Я думаю, что выяснил причину.

[BindRequired] а также [Required] атрибуты, определенные в PageModel похоже, игнорируются. Поэтому вам нужно проверить модель примерно так:

public class Schema
{
    [Required]
    [BindRequired]
    public string Id { get; set; }
}
public class TestModel : PageModel
{
    [BindProperty]
    public Schema Schema { get; set; }

    public async Task<IActionResult> OnPostAsync()
    {
        // SchemaId is NULL right here!
        if (!ModelState.IsValid) // Yet IsValid = true!
        {
            return Page();
        }

        return Page();
    }

}

Тогда в cshtml

<div asp-validation-summary="All"></div>
<form enctype="multipart/form-data" method="POST" asp-page="Upload">
    <input class="inputfile" type="file" id="UploadedFiles" multiple="multiple" name="UploadedFiles">
    <label for="UploadedFiles">
        <span>Choose a file...</span>
    </label>
    <input type="hidden" asp-for="Schema.Id">
    <button type="submit" class="inputfilesubmit">Upload</button>
</form>

Я до сих пор не нашел никакой документации, упоминающей это, но в документации Microsoft они также записывают атрибуты проверки в отдельный класс, поэтому я думаю, что такое поведение ожидается.

Надеюсь, что это решит проблему.

Другие вопросы по тегам