[英]How to apply C# Attributes to the type inside of a List for ASP.NET MVC Web Application
我有一個 model,它看起來像這樣:
public class ChartModel
{
public List<int> GoalList { get; set; } = new List<int>();
public List<string?> LabelList { get; set; } = new List<string?>();
[Required]
[StringLength(maximumLength: 75)]
public string? LabelValidation { get; set; }
[DefaultSettingValue("0")]
[Range(1, 100)]
public int GoalValidation { get; set; }
}
我希望每個 List 上方的屬性分別應用於它們內部的int
和string
類型。 看到只是在做類似的事情:
[Required]
[StringLength(maximumLength: 75)]
public List<string?> LabelList { get; set; } = new List<string?>();
不起作用,我制作了LabelValidation
和GoalValidation
變量,目的是在 HTML 表單中使用它們,其中用戶將標簽和目標的值輸入到列表中,如下所示:
<input asp-for="LabelList[ind]" class="form-control" placeholder="@ViewBag.Chart.LabelList[ind]" value="@ViewBag.Chart.LabelList[ind]" />
<span asp-validation-for="LabelValidation" class="text-danger"></span>
<input asp-for="GoalList[ind]" class="form-control" placeholder="@ViewBag.Chart.GoalList[ind]" value="@ViewBag.Chart.GoalList[ind]" />
<span asp-validation-for="GoalValidation" class="text-danger"></span>
但這似乎也不起作用。 如何將這些屬性應用於列表中的元素?
考慮為此目的使用自定義屬性:
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Reflection;
[AttributeUsage(AttributeTargets.Property, AllowMultiple = false)]
public class IntListValidationAttribute : ValidationAttribute
{
public int Minimum { get; private set; }
public int Maximum { get; private set; }
public IntListValidationAttribute(string errorMessage, int minimum, int maximum)
: base(errorMessage)
{
Minimum = minimum;
Maximum = maximum;
}
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
var obj = validationContext.ObjectInstance;
if (value is List<int> list)
{
PropertyInfo[] myPropertyInfo = obj.GetType().GetProperties();
for (int i = 0; i < myPropertyInfo.Length; i++)
{
if (myPropertyInfo[i].PropertyType.Equals(typeof(List<int>)))
{
foreach (var item in list)
{
if (item < Minimum || item > Maximum)
{
return new ValidationResult(ErrorMessage);
}
}
return ValidationResult.Success;
}
}
}
return new ValidationResult(ErrorMessage);
}
}
[AttributeUsage(AttributeTargets.Property, AllowMultiple = false)]
public class StringListValidationAttribute : ValidationAttribute
{
public int MaximumLength { get; private set; }
public StringListValidationAttribute(string errorMessage, int maximumLength)
: base(errorMessage)
{
this.MaximumLength = maximumLength;
}
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
var obj = validationContext.ObjectInstance;
if (value is List<string> list)
{
PropertyInfo[] myPropertyInfo = obj.GetType().GetProperties();
for (int i = 0; i < myPropertyInfo.Length; i++)
{
if (myPropertyInfo[i].PropertyType.Equals(typeof(List<string>)))
{
foreach (var item in list)
{
if (item.Length > MaximumLength)
{
return new ValidationResult(ErrorMessage);
}
}
return ValidationResult.Success;
}
}
}
return new ValidationResult(ErrorMessage);
}
}
然后將屬性應用於屬性:
public class ChartModel
{
[IntListValidation("Validation error", minimum: 2, maximum: 99)]
public List<int> GoalList { get; set; } = new List<int>();
[StringListValidation("Validation error", maximumLength: 15)]
public List<string> LabelList { get; set; } = new List<string>();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.