gpt4 book ai didi

C# 无法在自定义验证属性中找到其他属性

转载 作者:太空宇宙 更新时间:2023-11-03 14:49:19 24 4
gpt4 key购买 nike

尝试制作我自己的使用属性名称查找另一个属性的验证属性。

目前,我在寻找其他特性时遇到问题。看来我找不到此属性(或实际上找不到任何属性)。

property == null 的检查始终为真。

为什么我找不到属性有什么想法吗?

这是我制作的自定义过滤器

protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
var property = validationContext.ObjectInstance.GetType().GetProperty(PropertyName);

if (property == null)
{
return new ValidationResult(string.Format(
"Unknown property {0}",
new[] { PropertyName }
));
}

var propertyValue = property.GetValue(validationContext.ObjectInstance);

// Just for testing purposes.
return new ValidationResult(ErrorMessage);

}

这是我在 razor view 后面使用的模型。

public class OrganisationDetailsModel : PageModel
{

private readonly FormStateContext _context;

public OrganisationDetailsModel(FormStateContext context)
{
_context = context;
}

[BindProperty]
[RegularExpression(pattern: "(yes|no)")]
[Required(ErrorMessage = "Please select if you are registered on companies house")]
public string CompanyHouseToggle { get; set; }

[BindProperty]
[StringLength(60, MinimumLength = 3)]
[RequiredIf("CompanyHouseToggle")]
public string CompanyNumber { get; set; }

[BindProperty]
[StringLength(60, MinimumLength = 3)]
[Required(ErrorMessage = "Enter your organisation name")]
public string OrganisationName { get; set; }

[BindProperty]
[RegularExpression(pattern: "(GB)?([0-9]{9}([0-9]{3})?|[A-Z]{2}[0-9]{3})", ErrorMessage = "This VAT number is not recognised")]
[Required(ErrorMessage = "Enter your vat number")]
public string VatNumber { get; set; }

public void OnGet()
{
}

public IActionResult OnPost()
{
if (!ModelState.IsValid)
{
return Page();
}
return RedirectToPage("ApplicantDetails");
}

我很欣赏自定义验证属性目前并没有真正做任何事情,但那是因为我已经陷入了这个问题。

感谢您的帮助。

最佳答案

让我们使用以下代码片段来帮助解释这里发生的事情:

protected override ValidationResult IsValid(object value, ValidationContext ctx)
{
var typeFullName = ctx.ObjectInstance.GetType().FullName;

...
}

在此示例中,您可能希望 typeFullNameXXX.OrganisationDetailsModel,但它不是:它实际上是 System .String(您要验证的属性 的类型)。 System.String 显然没有名为例如的属性CompanyHouseToggleGetProperty 正确返回 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 的所有其他属性。
  • 添加 InputModel 类型的 Input 属性,使用 [BindProperty] 进行绑定(bind)。
  • 从现已移动的原始属性中删除了 [BindProperty]

最后一步是替换任何用法,例如CompanyNumberPageModel 对应的 .cshtml 中的 Input.CompanyNumber 并确保您使用 PageModel 类本身中访问属性时输入 . 前缀。

关于C# 无法在自定义验证属性中找到其他属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52518325/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com