首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RequiredIf GetProperty空引用

RequiredIf GetProperty空引用
EN

Stack Overflow用户
提问于 2020-05-26 04:17:31
回答 1查看 40关注 0票数 0

我有一个只对来宾显示的表单字段,如果它对来宾可显示,则是必需的。我遇到的问题是Extension.cs type.GetProperty(PropertyName)返回null,这会使整行返回一个null引用异常。我花了一些时间研究可能导致这种情况的原因,比如确保属性是公共的,实际上是一个属性,等等,但我被难住了。

Page.html.cs

代码语言:javascript
复制
 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

代码语言:javascript
复制
 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;
    }
}
EN

回答 1

Stack Overflow用户

发布于 2020-05-26 14:00:23

我遇到的问题是

Extension.cs type.GetProperty(PropertyName)返回null,这会使整行返回一个null引用异常。

这是因为context.ObjectInstance.GetType()返回对象类型,您不能反向从对象获取IsGuest属性,所以它返回null。

为了能够正常使用RequiredIfTrueAttribute,您可以将IsGuest和GuestEmail字段放入一个类中,然后在页面中将该类作为属性引用。

下面是一个基于您的代码的简单示例:

代码语言:javascript
复制
public class MyModel
    {
        public bool IsGuest { get; set; }
        [RequiredIfTrue(nameof(IsGuest), ErrorMessage = "Please enter a valid email address.")]
        [EmailAddress]
        public string GuestEmail { get; set; }
    }

页面:

代码语言:javascript
复制
   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()
        {

        }
    }

查看:

代码语言:javascript
复制
@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>

测试结果如下:

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62010118

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档