Проверка ядра ядра asp.net с аннотацией данных не работает - PullRequest
0 голосов
/ 22 октября 2018

Я потратил немало времени, чтобы узнать, но не смог.Когда я публикую свою модель без выбора какого-либо параметра - , фактически выбирая 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 голосов
/ 23 октября 2018

из RequiredAttribute

Атрибут RequiredAttribute указывает, что при проверке поля в форме поле должно содержать значение.Исключение проверки возникает, если свойство имеет значение null, содержит пустую строку ("") или содержит только символы пробела.

Теперь посмотрите на свойства вашей модели

public int LocationCountryId { get; set; }

public int AuditTypeId { get; set; }

public int LocationOfficeId { get; set; }

int не может быть пустым, не может содержать пустую строку и не может занимать пробелы, поэтому Required в этом контексте будет проходить проверку каждый раз.default(int) вернет 0, поэтому вы заметите, что эти свойства равны 0 при обратной передаче.

Либо вам нужно изменить их на int?, чтобы ваше свойство могло быть в нулевом состоянии, либо вам нужноиспользовать атрибут Range и сделать что-то вроде Range(1, int.MaxValue), чтобы можно было указать значение 0 для сообщения об ошибке.

...