簡體   English   中英

如何將 C# 屬性應用於 ASP.NET MVC Web 應用程序的列表內的類型

[英]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 上方的屬性分別應用於它們內部的intstring類型。 看到只是在做類似的事情:

[Required]
[StringLength(maximumLength: 75)]
public List<string?> LabelList { get; set; } = new List<string?>();

不起作用,我制作了LabelValidationGoalValidation變量,目的是在 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM