我有一个只对来宾显示的表单字段,如果它对来宾可显示,则是必需的。我遇到的问题是Extension.cs type.GetProperty(PropertyName)返回null,这会使整行返回一个null引用异常。我花了一些时间研究可能导致这种情况的原因,比如确保属性是公共的,实际上是一个属性,等等,但我被难住了。
Page.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;
}
}发布于 2020-05-26 14:00:23
我遇到的问题是
Extension.cs type.GetProperty(PropertyName)返回null,这会使整行返回一个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>测试结果如下:

https://stackoverflow.com/questions/62010118
复制相似问题