ASP. NET Core: проверка отдельных динамических полей c String. - PullRequest
0 голосов
/ 15 января 2020

Приложение: подается номер заказа, и отображаются номер детали, номер детали и количество для каждой детали (таким образом, 3 поля ввода на строку на деталь). Все эти значения отображаются как поля ввода, которые можно изменить. В PageModel я сохраняю все эти значения в списках, а затем перебираю их, чтобы найти те, которые были изменены. Если я нахожу модификации, я обновляю соответствующие части базы данных. Приложение на 100% используется людьми, которые знают, что делают. Все, что я упомянул выше, работает плавно. Функциональность есть.

Соответствующий интерфейс такой:

 @{ int index = 0;}
            @foreach (var part in Model.PartInfoList)
            {
            <tr class="row table-bordered">
                <td class="col-4">
                    <input type="hidden" asp-for="OldPartIDList" value="@part.PART_ID" name="OldPartIDList"/> @*This holds the "old" part ID's so the order can still be looked up when the user wants to change the part ID.*@
                    <input type="text" class="form-control mb-2 mr-sm-2" asp-for="NewPartIDList" value="@part.PART_ID" id="@part.PART_ID" name="NewPartIDList[@index]" onchange="HighlightField(this)" />
                    @*The id here is used to determine if the field should be highlighted or not.*@
                    <span class="text-danger" asp-validation-for="NewPartIDList[index]"></span>
                </td>
                <td class="col-4">
                    <input type="text" class="form-control mb-2 mr-sm-2" asp-for="PartNumberList" value="@part.PART_NUMBER" id="@part.PART_NUMBER" name="PartNumberList[@index]" onchange="HighlightField(this)" />
                    @*The id here is used to determine if the field should be highlighted or not.*@
                    <span class="text-danger" asp-validation-for="PartNumberList[index]"></span>
                </td> 
                <td class="col-4">
                    <input type="text" class="form-control mb-2 mr-sm-2" asp-for="QuantityList" value="@part.QUANTITY" id="@part.QUANTITY" name="QuantityList[@index]" onchange="HighlightField(this)" />
                    @*The id here is used to determine if the field should be highlighted or not.*@
                    <span class="text-danger" asp-validation-for="QuantityList[index]"></span>
                </td>
            </tr>
            index++;
            }

Списки объявлены так:

[DisplayName("Part ID"), BindProperty, Required]
        //[Range(1, 999999999, ErrorMessage = "Please enter a number between 1 and 999,999,999.")]
        [ResubmitSampleCenterOrderValidatorClass(FieldOptions.PART_ID, 1, 999999999, null)]
        public List<int> NewPartIDList { get; set; }

        [DisplayName("Part Number"), BindProperty, Required]
        //[StringLength(48, MinimumLength = 1, ErrorMessage = "Please enter a part number.")]
        //[ResubmitSampleCenterOrderValidatorClass(FieldOptions.PART_NUMBER, 1, 999999999, PartNumberArray: PartNumberList.ToArray())]
        public List<string> PartNumberList { get; set; }

        [DisplayName("Quantity"), BindProperty, Required]
        //[Range(1, 99999, ErrorMessage = "Please enter a number between 1 and 99,999.")]
        [ResubmitSampleCenterOrderValidatorClass(FieldOptions.QUANTITY, 1, 99999, null)]
        public List<int> QuantityList { get; set; }

Комментарии - это то, что я ' мы пытались Подробнее об этом позже.

Проблема: проверка, в частности, для полей ввода номера детали. Я не могу использовать

[StringLength(48, MinimumLength = 1, ErrorMessage = "Please enter a part number.")]

, потому что код будет пытаться преобразовать список строк в строку, и это, очевидно, не может произойти. Я просто хочу: 1) убедиться, что каждая часть # не может превышать 48 символов. 2) Пусть ошибка отображается именно под этим точным полем ввода, а НЕ над остальными (на самом деле это также проблема с полями идентификатора детали и количества, но сейчас меня больше интересуют поля части #).

Вещи, которые я пробовал: Как вы можете видеть из комментариев выше, я пробовал обычную проверку, и она не работала по вышеуказанным причинам. Затем я решил go к пользовательскому маршруту проверки:

public class ResubmitSampleCenterOrderValidatorClass: ValidationAttribute
    {
        public FieldOptions FieldDescriptor { get; set; }
        public int MinLength { get; set; }
        public int MaxLength { get; set; }
        public List<string> PartNumberList { get; set; }
        public string[] PartNumberArray { get; set; }

        public ResubmitSampleCenterOrderValidatorClass(FieldOptions FieldDescriptor, int MinLength, int MaxLength, string[] PartNumberArray)
        {
            this.FieldDescriptor = FieldDescriptor;
            this.MinLength = MinLength;
            this.MaxLength = MaxLength;
            this.PartNumberArray = PartNumberArray;
            PartNumberList = new List<string>();
        }

        protected override ValidationResult IsValid(object value, ValidationContext validationContext)
        {
            switch(FieldDescriptor)
            {
                case FieldOptions.PART_NUMBER:
                    break;  
            }
            return null;
        }
    }

FieldOptions - это просто перечисление, из которых PART_NUMBER равно 1. В любом случае, я не смог найти способ передать список строк в пользовательский валидатор, потому что он не является и не может быть установлен c. Я также не смог найти способ вывести мои числа из значения для идентификатора детали и количества, но это отдельная проблема.

Я также поместил индексы в атрибуты имени для моих полей ввода во внешнем интерфейсе , надеясь, что это может в конечном итоге привести к решению. Это был трюк, который я использовал в приложении JS / jQuery, которое я написал несколько лет go, чтобы сделать что-то очень похожее. Есть ли способ получить доступ к указанным c элементам из серверной части, так что я мог бы просто пройтись по каждому из них и проверить их самостоятельно?

Я гуглил и гуглил, но не могу найти кто-нибудь еще с этой проблемой. Возможно я еще не нашел волшебные c слова поиска. Я чувствую, что если мои проблемы проверки правильности части # будут решены, я смогу использовать это решение для проблем, с которыми я столкнулся в двух других областях.

Все идеи приветствуются! Дайте мне знать, если вам нужно больше разъяснений! Спасибо, и у вас есть фантазия c день!

РЕДАКТИРОВАТЬ: Более подробную информацию об синтаксической ошибке я получаю, когда пытаюсь передать

public List<string> PartNumberList { get; set; }

в пользовательский класс валидатора. Сам класс находится выше. Синтаксическая ошибка гласит:

Ссылка на объект требуется для нефиксированного c поля, метода или свойства 'ReviewOrderModel.PartNumberList'.

...