Обязательный строковый атрибут со значением 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 они также записывают атрибуты проверки в отдельный класс, поэтому я думаю, что такое поведение ожидается.
Надеюсь, что это решит проблему.