Почему 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;}

Дальнейшее чтение:

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