使用数据注释验证绑定到SelectList对象的下拉列表

时间:2017-02-15 16:33:47

标签: c# asp.net asp.net-mvc asp.net-core asp.net-core-mvc

我正在尝试遵循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.

有关如何正确显示我想要的错误消息的任何想法?我似乎无法找到有关此问题的任何文档。

1 个答案:

答案 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>