Обязательно, если GetProperty Null Ссылка - PullRequest
0 голосов
/ 25 мая 2020

У меня есть поле формы, которое отображается только для гостей и является обязательным, если оно отображается для гостей. Проблема, с которой я сталкиваюсь, связана с Extension.cs type.GetProperty(PropertyName) возвращает null, в котором вся строка возвращает исключение нулевой ссылки. Я потратил некоторое время на изучение того, что может вызвать это, например, чтобы убедиться, что свойство publi c, на самом деле свойство, et c, но я в тупике.

Страница. html .cs

 public bool IsGuest { get; set; } 

 [BindProperty]
 [RequiredIfTrue(nameof(IsGuest), ErrorMessage = "Please enter a valid email address.")]
 [EmailAddress]
  public string GuestEmail { get; set; }

     public IActionResult OnGet()
     {
        var claimsIdentity = (ClaimsIdentity)User.Identity;
            var claim = "";
            if (claimsIdentity.Claims.Any())
            {
                claim = claimsIdentity.FindFirst(ClaimTypes.NameIdentifier).Value;
                IsGuest = false;
            }
            else
            {
                IsGuest = true;
                claim = Request.Cookies[".AspNetCore.Session"];
            }
      }

Extention.cs

 public class RequiredIfTrueAttribute : RequiredAttribute
{
    private string PropertyName { get; set; }

    public RequiredIfTrueAttribute(string propertyName)
    {
        PropertyName = propertyName;
    }

    protected override ValidationResult IsValid(object value, ValidationContext context)
    {
        object instance = context.ObjectInstance;
        Type type = instance.GetType();

        bool.TryParse(type.GetProperty(PropertyName).GetValue(instance)?.ToString(), out bool propertyValue);

        if (propertyValue && string.IsNullOrWhiteSpace(value?.ToString()))
        {
            return new ValidationResult(ErrorMessage);
        }

        return ValidationResult.Success;
    }
}

1 Ответ

0 голосов
/ 26 мая 2020

Проблема, с которой я столкнулся, связана с типом 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>

Вот результат теста:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...