Вам не нужно менять атрибут [Range], так как [Range] и другие встроенные валидаторы DataAnnotations no-op при задании пустого значения. Просто сделайте свойство самого типа int? а не int. Неизменяемые свойства ValueType (например, int) всегда автоматически требуются.
Вы можете проверить, работает ли сканер штрих-кода, выполнив команду xev
на компьютере с Linux (то же самое относится и к другим ОС), если xev что-то выводит, браузер должен вызвать событие клавиатуры. Если xev не выводит, сканер работает не так, как ожидалось.