Сообщение проверки формы не отображается при использовании частичного просмотра

Я работаю над приложением ASP.NET core 2.0, в котором я создал форму для ввода данных. Проверяя, работает ли проверка, я заметил, что не отображаются сообщения проверки для обязательного свойства моей модели представления.

Когда требуемый ввод пуст, и я нажимаю кнопку «Сохранить», я не могу продолжить, поэтому ввод требуется, но сообщения не видно.

Модель представления для моего представления формы имеет список моделей представления как свойство, потому что часть формы должна изменяться динамически.

Это моя основная модель просмотра:

public class SettingsViewModel
{
    public List<KeyValueViewModel> KeyValuePairs { get; set; }
    public string Description { get; set; }
}

Вот KeyValueViewModel

public class KeyValueViewModel
{
    public int Id { get; set; }
    [Display(Name = "Key")]
    [Required(ErrorMessage = "Key is required")]
    public string Key { get; set; }
    [Display(Name = "Value")]
    [Required(ErrorMessage = "Value is required")]
    public string Value { get; set; }

    public Guid SettingFileId { get; set; }
    public Dictionary<Guid, string> SettingFileDropdownOptions { get; set; }
}

Вот основной вид:

@model SettingsViewModel
<form asp-action="Create" id="SettingsForm">
    <div asp-validation-summary="ModelOnly" class="text-danger"></div>
    <div class="row">
        <div class="col-md-12">
            <label asp-for="@Model.KeyValuePairs[0].Key" class="control-label col-md-3 no-left-padding"></label>
            <label asp-for="@Model.KeyValuePairs[0].Value" class="control-label col-md-offset-1 no-left-padding"></label>
        </div>
    </div>
    @for (var i = 0; i < Model.KeyValuePairs.Count; i++)
    {
        var keyValuePair = Model.KeyValuePairs[i];
        keyValuePair.Id = i;
        <div id="KeyValuePairsContainer">
            @Html.Partial("_settingKeyValue", keyValuePair)
        </div>
    }
    <div class="form-group col-md-12 no-left-padding">
        <label asp-for="Description" class="control-label"></label>
        <textarea asp-for="Description" class="form-control" ></textarea>
        <span asp-validation-for="Description" class="text-danger"></span>
    </div>
    <div class="form-group col-md-12 no-left-padding">
        <input type="submit" value="Opslaan" class="btn btn-primary" id="Submit" />
        <a href="@Url.Action("Index", "Home")" class="btn btn-default" id="Cancel">Annuleren</a>
    </div>
</form>

И вот частичное представление, которое рендерится:

@model KeyValueViewModel
<div class="form-group col-md-4 no-left-padding">
    <input asp-for="@Model.Key" class="form-control  col-md-3" id="[email protected]" name="KeyValuePairs[@Model.Id].Key" required="required"/>
    <span asp-validation-for="@Model.Key" class="text-danger"></span>
</div>
<div class="form-group col-md-4 no-left-padding">
    <input asp-for="@Model.Value" class="form-control col-md-3" id="[email protected]" name="KeyValuePairs[@Model.Id].Value" required="required" />
    <span asp-validation-for="@Model.Value" class="text-danger"></span>
</div>

Сообщение о проверке свойств Key и Value не отображается, когда должно. Мы протестировали свойство Description в SettingsViewModel, добавив требуемый тег с сообщением, и это сработало нормально.

Как мне получить сообщение проверки KeyValueViewModel, отображаемое в моем основном представлении?

Изменить

<span class="text-danger field-validation-valid" data-valmsg-for="Key" data-valmsg-replace="true"></span>

Не обновляется до class = "field-validation-error", когда должно быть


person Jeroen    schedule 23.11.2017    source источник
comment
вы пробовали включить jquery.validate.js внутрь самого частичного представления?   -  person Manoz    schedule 23.11.2017
comment
В моем основном представлении у меня есть стандартный код @section Scripts {@ {await Html.RenderPartialAsync (_ValidationScriptsPartial);}}, который включает библиотеку jquery.valide.js   -  person Jeroen    schedule 23.11.2017
comment
Добавление того же кода в частичное представление не работает (я думаю, потому что он просто добавляет одну и ту же библиотеку дважды)   -  person Jeroen    schedule 23.11.2017


Ответы (2)


По какой-то причине asp-validation-for не работает, если у входа есть атрибут name="...". Удаление атрибута name из ввода может решить проблему.

Это связано с тем, что сама проверка asp.net использует атрибут name и ожидает, что он будет соответствовать имени атрибута в asp-for (точно, включая первую заглавную букву).

person David Dostal    schedule 12.05.2019

asp-validation-for принимает название свойства

вместо того

<span asp-validation-for="@Model.Value" class="text-danger"></span>

должно быть

<span asp-validation-for="Value" class="text-danger"></span>
person tchelidze    schedule 23.11.2017
comment
Просто попробовал, к сожалению, проблему не решает. - person Jeroen; 23.11.2017
comment
@Jeroen, вы тоже изменили <input asp-for="@Model.Value".. на <input asp-for="Value"? - person tchelidze; 23.11.2017
comment
Да. То же самое для ключа - person Jeroen; 23.11.2017
comment
Попробуйте удалить id="..." из input элементов - person tchelidze; 23.11.2017
comment
Я использую идентификаторы для своих приемочных тестов и для своего кода javascript, и я не вижу, как удаление идентификатора решит проблему. - person Jeroen; 23.11.2017
comment
Вспомогательная функция тега asp-validation-for связывает сообщение проверки с элементом input с его id. в противном случае, как он не может знать, какой ввод проверять. - person tchelidze; 23.11.2017
comment
Хорошо, когда я удаляю Id из ввода, он получает идентификатор Key, и когда я нажимаю кнопку отправки без заполнения ключа, он обновляет класс ввода до input-validation-error, но это не меняет класс элемента span - person Jeroen; 23.11.2017
comment
Это также не добавляет новый диапазон в мой диапазон проверки поля - person Jeroen; 23.11.2017