我正在尝试遵循ASP.NET Core中验证的最佳实践。我有一个联系表单,页面绑定到视图模型。
模型
public class ViewModel {
...
[Required(ErrorMessage = "Select a city")]
public int CityID { get; set; }
public SelectList CityList { get; set; }
}
查看
<select id="input-request-type" class="form-control" asp-for="CityID" asp-items="@Model.CityList">
<option value="" hidden disabled selected>Select a city</option>
</select>
<span asp-validation-for="CityID"></span>
这会在HTML中转换为类似内容:
<select class="input-validation-error" data-val="true" data-val-required="Select a city" name="CityID">
<option value="" hidden="" disabled="" selected="">Select a city</option>
<option value="9">Toronto</option>
<option value="12">New York</option>
</select>
上述代码的问题在于验证不会触发错误。我的猜测是,验证仍会检测提交中的值,即使它是一个空字符串。
我尝试了什么:
我尝试修改模型上的数据注释,如下所示:
[Required(ErrorMessage = "Name is required")]
public string Name { get; set; }
...
[BindRequired]
public int CityID { get; set; }
public SelectList CityList { get; set; }
这显示验证错误,但显示Name is required
。它获取了第一个可用的验证错误,但不是我想要的,所以我将其更改为以下内容:
...
[BindRequired]
[Required(ErrorMessage = "Select a city")]
public int CityID { get; set; }
public SelectList CityList { get; set; }
这也显示错误,但它完全忽略了我想要的错误消息。输出为A value for the 'CityID' property was not provided.
有关如何正确显示我想要的错误消息的任何想法?我似乎无法找到有关此问题的任何文档。
答案 0 :(得分:0)
您似乎可以覆盖视图本身的消息。
<强>模型强>
[BindRequired]
public int CityID { get; set; }
public SelectList CityList { get; set; }
查看强>
<style>
.field-validation-valid {
display: none;
}
</style>
<select id="input-request-type" class="form-control" asp-for="CityID" asp-items="@Model.CityList">
<option value="" hidden disabled selected>Select a city</option>
</select>
<span asp-validation-for="CityID">Select a city</span>
验证的span元素将转换为以下内容,具体取决于值是否有效:
// valid
<span class="field-validation-valid" data-valmsg-for="CityID" data-valmsg-replace="true">
Select a city
</span>
// invalid
<span class="field-validation-error text-danger" data-valmsg-for="CityID" data-valmsg-replace="true">
Select a city
</span>