ASP.NET MVC необязательное поле обрабатывается как требуется

У меня есть это поле, которое по какой-то причине, когда я нажимаю на кнопку отправить, получает сообщение проверки, что поле является обязательным.

[DisplayName("Total Budget:")]
public double Budget { get; set; }

@Html.EditorFor(model => model.account.Budget)
@Html.ValidationMessageFor(model => model.account.Budget)

public class Account
{
    [DisplayName("Total Budget:")]
    public double Budget { get; set; } //dropdown
}

8 ответов

Решение

Встроенный DefaultModelBinder в MVC будет выполнять обязательную проверку и проверку типа данных для типов значений, таких как int, DateTime, decimal и т. Д. Это произойдет, даже если вы явно не указали проверку с использованием некоторого подобного [Required],

Чтобы сделать это необязательным, вы должны определить его как обнуляемый:

public double? Budget { get; set; }

Вы должны добавить следующую строку в application_start (global.asax)

DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false;

Источник: свойство Unrequired продолжает получать атрибут data-val-required

double это тип значения Типы значений всегда содержат значение, даже если вы его не установили. Это значение является значением по умолчанию для его типа (в данном случае 0.0). Все типы значений обрабатываются в соответствии с требованиями платформы. Единственный способ обойти это - создать пользовательский связыватель модели, но это не помешает модели содержать значение по умолчанию (потому что нельзя сказать, что оно не было введено).

Таким образом, даже если вы создадите пользовательское связующее, при обработке вашей модели вы не сможете определить, вошел ли кто-то 0 или это было просто значением по умолчанию.

Таким образом, единственное реальное решение состоит в том, чтобы изменить модель представления, чтобы использовать обнуляемый тип, такой как Nullable<double> (сокращение double?).

Используйте Nullable или ? после имени атрибута.

Вы, вероятно, измените бюджет с double в double?

Вы, вероятно, можете попробовать добавить этот атрибут в контроллер

BindExclude([Bind(Exclude="Budget")]) также

Я только что столкнулся с проблемой с проектом, перенесенным на .Net 6.0, вдруг некоторые поля стали обязательными, даже если для него нет аннотации данных.

Например, в

      public class LoginModel
{
    [BindProperty]
    public InputModel Input { get; set; }

    [TempData]
    public string ErrorMessage { get; set; }
    ...
}

Я получил ошибку: «Поле ErrorMessage обязательно», что, конечно, не имеет никакого смысла.

Проект имеет функция включена, похоже, это вызывает это.

Просто перепишите свойство на

       public string? ErrorMessage { get; set; }

Чтобы исправить это (обратите внимание на знак вопроса)

Вы также можете использовать:

       services.AddControllers(options => options.SuppressImplicitRequiredAttributeForNonNullableReferenceTypes = true);

Используйте аннотацию [NotMapped], это удалит необходимую проверку в потоке, вы также используете собственные атрибуты отображения

Другие вопросы по тегам