Почему MVC Model Binder требуется для int, long значений?
У меня есть модель, как это
public int Id {get;set;}
[Required]
public string FirstName{get; set}
[Required]
public string LastName{get; set}
Идентификатор автоматически генерируется в БД. когда я хочу вызвать действие Create ModelState говорит, что "поле Id обязательно"!!!! Я нашел это для моей проблемы, но это не чистое решение. Есть ли другой способ решить эту проблему?
Есть ли способ изменить поведение Mvc ModelBinder для типов значений?
3 ответа
Лучшее решение этой проблемы - использовать модель представления. Модель представления - это класс, который вы специально разрабатываете для удовлетворения требований вашего представления. Таким образом, ваше действие контроллера примет эту модель представления в качестве параметра. Просто перестаньте передавать свои доменные модели вашим представлениям. Вот и все.
И если вы не хотите следовать рекомендациям и использовать модели представлений, вы можете отключить эту неявную проверку, добавив следующее в Application_Start
:
DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false;
другой взлом состоит в том, чтобы исключить это свойство из привязки с помощью [Bind(Exclude = "Id")]
приписывать. Да, это взлом, но если вы не будете следовать хорошей практике, вам придется жить с взломами.
Хотя @DarinDimitrov предложил хороший вариант использования View Models, в дополнение к этому ответу. Кроме того, рассмотрите эту опцию, только если вы не хотите создавать View-Model
Как насчет ModelState["Id"].Errors.Clear();
в вашем Post
Метод действия?
Вы также можете установить тип свойства Nullable<T>
и затем просто вручную принудительно выполните все необходимые проверки, которые вам могут понадобиться перед работой с базой данных.
public int? Id {get;set;}
Дальнейшее чтение: