我正在开发一个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”答案 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
中的属性名称匹配(确切地说,包括第一个大写字母)。