Давайте используем следующий фрагмент кода, чтобы объяснить, что здесь происходит:
protected override ValidationResult IsValid(object value, ValidationContext ctx)
{
var typeFullName = ctx.ObjectInstance.GetType().FullName;
...
}
В этом примере вы можете ожидать, что typeFullName
будет XXX.OrganisationDetailsModel
, но это не такt : на самом деле System.String
(тип свойства , который вы пытаетесь проверить).У System.String
явно нет свойства с именем, например CompanyHouseToggle
, и поэтому GetProperty
правильно возвращает null
.
Я не видел много случаев, когда [BindProperty]
использовался более одного раза наPageModel
.Это, конечно, возможно, но похоже, что каждое свойство рассматривается как индивидуальное и что PageModel
само по себе не проверяется.
Чтобы обойти это, вы можете просто превратить свои индивидуальные свойства в комплекснапечатайте и используйте это вместо этого.Документы и примеры для этого используют встроенный класс внутри класса PageModel
.Вот пример обновленного класса OrganisationDetailsModel
:
public class OrganisationDetailsModel : PageModel
{
...
[BindProperty]
public InputModel Input { get; set; }
public void OnGet() { }
public IActionResult OnPost()
{
if (!ModelState.IsValid)
return Page();
return RedirectToPage("ApplicantDetails");
}
public class InputModel
{
[RegularExpression(pattern: "(yes|no)")]
[Required(ErrorMessage = "Please select if you are registered on companies house")]
public string CompanyHouseToggle { get; set; }
[StringLength(60, MinimumLength = 3)]
[RequiredIf("CompanyHouseToggle")]
public string CompanyNumber { get; set; }
...
}
}
Сюда входят следующие изменения:
- Создание класса
InputModel
для хранения всех свойств. - Удаление всех других свойств, которые теперь перемещены в
InputModel
. - Добавление свойства
Input
типа InputModel
, которое связывается с помощью [BindProperty]
. - Удалено
[BindProperty]
из исходных свойств, которые теперь были перемещены.
Последний шаг - заменить любое использование, например, CompanyNumber
на Input.CompanyNumber
в PageModel
в соответствующем .cshtml
и убедиться, что вы используете префикс Input.
при доступе к свойствам.внутри самого класса PageModel
.