使用部分视图时未显示表单验证消息

时间:2017-11-23 12:46:30

标签: c# asp.net-core asp.net-core-tag-helpers

我正在开发一个ASP.NET核心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="KeyValuePair_Key_@Model.Id" 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="KeyValuePair_Value_@Model.Id" name="KeyValuePairs[@Model.Id].Value" required="required" />
    <span asp-validation-for="@Model.Value" class="text-danger"></span>
</div>

Key和Value属性上的验证消息不会显示。我们通过添加带有消息的必需标记来测试SettingsViewModel的Description属性,这样就可以了。

如何获取主视图中显示的KeyValueViewModel的验证消息?

修改

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

当它应该

时,不会更新到class =“field-validation-error”

2 个答案:

答案 0 :(得分:0)

asp-validation-for接受属性名称

而不是

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

应该是

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

答案 1 :(得分:0)

由于某种原因,如果输入具有asp-validation-for属性,则name="..."不起作用。从输入中删除name属性可以解决问题。

这是因为asp.net验证本身使用name属性,并且它希望它与asp-for中的属性名称匹配(确切地说,包括第一个大写字母)。