Требуется, если элемент в списке пользовательских входов

У меня есть представление модели, которое содержит список значений ICustomInput

public class DemoViewModel {
    [Required]
    public string FirstName {get; set;}
    [Required]
    public string LastName {get; set;}

    [RequiredIf("DayPhoneRequired", true)]
    public string DayPhone {get; set;}
    public bool DayPhoneRequired {get; set;} = false;
    public List<ICustomInput> CustomInputFields { get; set; } = new List<ICustomInput>();
}

пример ICustomInput

public class CustomTextInput : ICustomInput
    {
        public CustomField Field { get; }
        public string DisplayName { get; set; }

        [RequiredIf("DataValueRequired", true, ErrorMessage = "This is a required field")]
        public virtual string DataValue { get; set; }
        public bool DataValueRequired { get; set; } = false;
        public virtual string ClassName => "CustomTextInput";
        public string AssemblyName => "Application.Models";
    }

Цель этого состоит в том, чтобы я мог получить информацию из БД о пользовательских полях ввода, которые вошедший в систему клиент запросил в форме. Один клиент может захотеть пару текстовых полей, другой клиент может захотеть выпадающий список. Эти настраиваемые поля могут также требовать или не требовать ввода. (Объект CustomField - это более старый объект, возвращаемый dataLayer и интенсивно используемый, я не хочу его перестраивать, но предположим, что он просто полон строк)

У меня есть шаблон редактора для конкретных реализаций ICustomInputs, а также пользовательских связывателей, которые позволяют мне получать данные по почте. Но проблема у меня заключается в том, что атрибут RequiredIf устанавливает ненавязчивые значения данных для проверки на стороне клиента одинаково для всех ICustomInputs. Это имеет смысл, поскольку все они имеют одинаковое имя для своего зависимого свойства, но это не решает проблему, которую я имею.

Мой вид отображает список ICustomInput просто:

@Html.EditorFor(model => model.CustomInputFields)

Затем каждый конкретный тип, который реализует ICustomInput, имеет свой собственный шаблон editorTemplate, подобный следующему:

<div class="columnPositioner">
    <div class="inputContainer">
        @Html.TextBoxFor(model => model.DataValue, new
   {
       @class = "inputFields input-lg form-control",
       placeholder = Model.Field.Display
   })
        <span class="inputLabel">
            @Html.LabelFor(model => model.Field.Display, Model.Field.Display)
        </span>
        @Html.ValidationMessageFor(model => model.DataValue, "", new { @class = "text-danger" })
        @Html.HiddenFor(model => model.DataValueRequired)
    </div>
</div>

Полученный HTML выглядит так:

<select name="CustomInputFields[0].DataValue" class="inputFields input-lg form-control" id="CustomInputFields_0__DataValue" data-val="true" data-val-requiredif-operator="EqualTo" data-val-requiredif-dependentvalue="True" data-val-requiredif-dependentproperty="DataValueRequired" data-val-requiredif="This is a required field"><option value="">TEST01</option>
<option value="01">01</option>
<option value="02">02</option>
<option value="03">03</option>
</select>
<input name="CustomInputFields[0].DataValueRequired" class="hasContent" id="CustomInputFields_0__DataValueRequired" type="hidden" value="True" data-val-required="The DataValueRequired field is required." data-val="true">
<input name="CustomInputFields[1].DataValue" class="inputFields input-lg form-control" id="CustomInputFields_1__DataValue" type="text" placeholder="TEST02" value="" data-val="true" data-val-requiredif-operator="EqualTo" data-val-requiredif-dependentvalue="True" data-val-requiredif-dependentproperty="DataValueRequired" data-val-requiredif="This is a required field">
<input name="CustomInputFields[1].DataValueRequired" id="CustomInputFields_1__DataValueRequired" type="hidden" value="False" data-val-required="The DataValueRequired field is required." data-val="true">

Скрытое поле имеет правильное имя, но как мне получить атрибут для установки свойства data-val-requiredif-зависящий от свойства фактического идентификатора / имени в скрытом поле?

В настоящее время у меня нет собственного редактора шаблонов для списка. У меня был один, но я не смог заставить его правильно связать данные. Удаление шаблона редактора в Списке и создание уникальных шаблонов редактора для конкретных реализаций ICustomInput дали мне все необходимые элементы управления макетом пользовательского интерфейса и правильно связали данные, но теперь я не могу заставить работать проверку на стороне клиента. Если это просто шаблон редактора, как это может выглядеть?

Обновить

Это исправление, но мне это не нравится. У меня есть javascript, который уже выполняет.each через входы для применения стилей, поэтому я добавил это в.each:

function requiredIfHack($input) {
    var depPropVal = $input.data("val-requiredif-dependentproperty");
    //return if the value exists
    if ($("#" + depPropVal).length) return;

    //it doesn't. it's missing the parent object name
    var parentName = $input.attr("name").split(".")[0].replace("[", "_").replace("]", "_");
    $input.data("val-requiredif-dependentproperty", parentName + "_" + depPropVal);
}

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

0 ответов