带有数据注释的asp.net核心选择验证不起作用

时间:2018-10-22 12:39:05

标签: validation select razor asp.net-core-mvc data-annotations

我花了很多时间来找出答案,但我没有。当我发布模型而未选择任何选项-实际上选择0 - Select-选项时,Required验证不起作用。

我还尝试将以编程方式添加的默认选项从服务代码中删除到视图代码中,验证也没有像这样工作。

如果我完全删除了默认选项,则视图引擎会自动从列表中选择第一个选项,并且永远不会进行验证。

如何使服务器端验证正确完成?

这是我的模型

public class AuditViewModel
{
    public Guid Id { get; set; }

    [Display(Name = "Subject")]
    [Required(ErrorMessage = "IsRequired")]
    public string Subject { get; set; }

    public string AuditType { get; set; }

    public string LocationCountry { get; set; }

    public string LocationOffice { get; set; }

    [Required(ErrorMessage = "IsRequired")]
    [Display(Name = "AuditType")]
    public int AuditTypeId { get; set; }

    public string CreatedOn { get; set; }

    public string ModifiedOn { get; set; }

    public string CreatedBy { get; set; }

    [Display(Name = "Description")]
    [Required(ErrorMessage = "IsRequired")]
    public string Description { get; set; }

    [Display(Name = "Country")]
    [Required(ErrorMessage = "IsRequired")]
    public int LocationCountryId { get; set; }

    [Display(Name = "Office")]
    [Required(ErrorMessage = "IsRequired")]
    public int LocationOfficeId { get; set; }

    [Display(Name = "Season")]
    public string Season { get; set; }

    public List<SelectListItem> Countries { get; set; }

    public List<SelectListItem> AuditTypes { get; set; }

    public List<SelectListItem> Offices { get; set; }

    public List<AuditViewModel> AuditList { get; set; }
}

这是服务,用于获取选择列表数据并创建要绑定的列表

public class AuditViewModelService : IAuditViewModelService
{
    public List<SelectListItem> GetAuditTypes()
    {
        var list = new List<SelectListItem>
            {
                new SelectListItem { Text = _sharedLocalizer.GetLocalizedString("Select"), Value = "0", Selected = true }
            };
        foreach (AuditType item in Enum.GetValues(typeof(AuditType)))
        {
            list.Add(new SelectListItem { Text = _enumLocalizer.GetLocalizedString(item.ToString()), Value = ((int)item).ToString() });
        }
        return list;
    }

    public List<SelectListItem> GetCountries()
    {
        var list = new List<SelectListItem> { new SelectListItem { Text = _sharedLocalizer.GetLocalizedString("Select"), Value = "0", Selected = true } };
        list.AddRange(_countryRepository.GetAll().ToList().ToSelectListItemList("Name"));
        return list;
    }

    public List<SelectListItem> GetOffices()
    {
        var list = new List<SelectListItem> { new SelectListItem { Text = _sharedLocalizer.GetLocalizedString("Select"), Value = "0", Selected = true } };
        list.AddRange(_officeRepository.GetAll().ToList().ToSelectListItemList("Name"));
        return list;
    }
}

这是视图

的部分选择输入
<div class="form-group m-form__group">
    <label asp-for="AuditTypeId"></label>
    <select asp-for="AuditTypeId" asp-items="@Model.AuditTypes" class="form-control m-input m-input--square" id="auditTypeId">
        <option value="0">Select</option>
    </select>
    <span asp-validation-for="AuditTypeId"></span>
</div>
<div class="form-group m-form__group">
    <label asp-for="LocationCountryId"></label>
    <select asp-for="LocationCountryId" asp-items="@Model.Countries" class="form-control m-input m-input--square" id="locationCountryId">
        <option value="0">Select</option>
    </select>
    <span asp-validation-for="LocationCountryId"></span>
</div>
<div class="form-group m-form__group">
    <label asp-for="LocationOfficeId"></label>
    <select asp-for="LocationOfficeId" asp-items="@Model.Offices" class="form-control m-input m-input--square" id="locationOfficeId">
        <option value="0">Select</option>
    </select>
    <span asp-validation-for="LocationOfficeId"></span>
</div>

1 个答案:

答案 0 :(得分:4)

来自RequiredAttribute

  

RequiredAttribute属性指定在验证表单上的字段时,该字段必须包含一个值。如果属性为null,包含空字符串(“”)或仅包含空格字符,则会引发验证异常。

现在查看您的模型属性

public int LocationCountryId { get; set; }

public int AuditTypeId { get; set; }

public int LocationOfficeId { get; set; }

int不能为null,不能包含空字符串并且不能使用空格,因此,Required在这种情况下将每次都通过验证。 default(int)将返回0,因此您会注意到这些属性在回发时为0

您需要将其更改为int?,以便您的属性可以为空状态,或者您需要使用Range属性并执行类似Range(1, int.MaxValue)的操作,以便可以将错误消息的值为0。