Проблема, с которой я столкнулся, связана с типом Extension.cs. GetProperty (PropertyName) возвращает null, в котором вся строка возвращает исключение нулевой ссылки.
Это потому, что context.ObjectInstance.GetType()
возвращает тип объект , вы не можете получить свойство IsGuest
из объекта в обратном порядке, поэтому он возвращает null.
Чтобы иметь возможность использовать RequiredIfTrueAttribute в обычном режиме , вы можете поместить поля IsGuest и GuestEmail в класс, и затем ссылаться на класс как на свойство на странице.
Вот простой пример, основанный на вашем коде:
public class MyModel
{
public bool IsGuest { get; set; }
[RequiredIfTrue(nameof(IsGuest), ErrorMessage = "Please enter a valid email address.")]
[EmailAddress]
public string GuestEmail { get; set; }
}
Страница:
public class AttrTestModel : PageModel
{
[BindProperty]
public MyModel data { get; set; } = new MyModel();
public void OnGet()
{
var claimsIdentity = (ClaimsIdentity)User.Identity;
var claim = "";
if (claimsIdentity.Claims.Any())
{
claim = claimsIdentity.FindFirst(ClaimTypes.NameIdentifier).Value;
data.IsGuest = false;
}
else
{
data.IsGuest = true;
claim = Request.Cookies[".AspNetCore.Session"];
}
}
public void OnPost()
{
}
}
Просмотр :
@page
@model WebApplication_razorpage_new.Pages.AttrTestModel
@{
ViewData["Title"] = "AttrTest";
}
<h1>AttrTest</h1>
<form method="post">
<div class="form-group">
<label asp-for="@Model.data.IsGuest" class="control-label"></label>
<input id="Radio1" type="radio" asp-for="@Model.data.IsGuest" value="@Model.data.IsGuest" />
</div>
@if (Model.data.IsGuest)
{
<div class="form-group">
<label asp-for="@Model.data.GuestEmail" class="control-label"></label>
<input asp-for="@Model.data.GuestEmail" class="form-control" />
<span asp-validation-for="@Model.data.GuestEmail" class="text-danger"></span>
</div>
}
<input id="Submit1" type="submit" value="submit" />
</form>
Вот результат теста: